【问题标题】:MySQL Subquery Repetition Avoidance in WHERE/AND在 WHERE/AND 中避免 MySQL 子查询重复
【发布时间】:2013-09-12 05:33:13
【问题描述】:

我有一个 SQL 查询,我在 WHERE 子句中使用子查询。然后我需要再次使用相同的子查询将其与不同的列进行比较。

我假设我没有办法在子查询之外访问“emp_education_list li”?

我猜子查询重复是多余的。坦率地说,我对 SQL 有点生疏了。

SELECT e.fname, e.lname
    FROM employee e, emp_education_list l
    WHERE
        e.skillsID = l.skillsID
    AND
    (
        SELECT li.educationID
            FROM emp_education_list li, job j
            WHERE j.skillsID = li.skillsID
            AND j.jobID = 1001
    ) = l.educationID
    AND
    (
        SELECT li.edu_level
            FROM emp_education_list li, job j
            WHERE j.skillsID = li.skillsID
            AND j.jobID = 1001
    ) < l.edu_level
;

【问题讨论】:

    标签: mysql sql subquery reusability


    【解决方案1】:

    试试看,

    SELECT  e.fname, e.lname
    FROM    employee e 
            INNER JOIN emp_education_list l
                ON e.skillsID = l.skillsID
            INNER JOIN
            (
                SELECT  li.educationID, li.edu_level
                FROM    emp_education_list li
                        INNER JOIN job j 
                            ON j.skillsID = li.skillsID
                WHERE   j.jobID = 1001
            ) x ON  l.educationID = x.educationID
    WHERE   x.edu_level < l.edu_level
    

    【讨论】:

      【解决方案2】:

      JOIN试试这个,我想正确的加入会解决剩下的问题

      SELECT e.fname, e.lname
      FROM employee e 
      JOIN  emp_education_list l ON (e.skillsID = l.skillsID)
      JOIN job j  ON ( j.skillsID = l.skillsID AND j.jobID = 1001) 
      

      【讨论】:

      • 返回的结果与我当前的语句不同。您的查询返回一个空集,而我的返回一行。
      • 你能用你的数据集添加小提琴示例吗
      【解决方案3】:

      试试这个:

      SELECT e.fname, e.lname
      FROM employee e, 
           emp_education_list l,
           job j
      WHERE
               e.skillsID = l.skillsID
           and j.skillsID = l.skillsID
           and j.jobID = 1001 
      

      【讨论】:

      • 返回的结果与我当前的语句不同。您的查询返回一个空集,而我的返回一行。
      • 如果查询返回空集,你应该使用'JOIN'。很难理解您如何将数据存储在表格中。
      猜你喜欢
      • 2021-02-15
      • 2016-06-28
      • 2018-11-17
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2019-04-16
      相关资源
      最近更新 更多