【问题标题】:Subquery joining same table子查询加入同一张表
【发布时间】:2018-04-24 09:31:45
【问题描述】:

所以我有一张员工表:

我正在尝试创建一个查询来显示该员工的所有信息,但我对 Employee_Reports_To 位有点困惑。我想要显示的是存储在此列中的 Employee_ID 的 First_Name 和 Last_Name(例如 Joe Bloggs ID 1,报告给员工 Joanne Blog ID 50)

这需要一个连接还是一个简单的选择。当我尝试时,数据库的链接有问题..

SELECT employee.*, departments.Department_Name, 
            jobTitle.Job_Title,
            (SELECT manager.First_Name, manager.Last_Name
                FROM Employee manager
                INNER JOIN employee AS employeeReportsTo
          ON manager.Employee_Reports_To = manager.Employee_ID   
            ) AS Reports_To
            FROM Employee employee
            LEFT JOIN Departments AS departments
                ON departments.Departments_ID = employee.Departments_ID
            LEFT JOIN Job_Title AS jobTitle
                ON jobTitle.Job_Title_ID = employee.Job_Title_ID
             ORDER BY `employee`.`Record_Active` DESC,
                     `employee`.`First_Name` ASC

任何帮助将不胜感激!

【问题讨论】:

    标签: mysql join subquery


    【解决方案1】:

    试试这个解决方案:

    SELECT emp.*,
           manager.First_Name, 
           manager.Last_Name,
           departments.Department_Name, 
           jobTitle.Job_Title
    FROM Employee emp
    INNER JOIN Employee manager
    ON emp.Employee_Reports_To = manager.Employee_ID
    LEFT JOIN Departments AS departments
    ON departments.Departments_ID = emp.Departments_ID
    LEFT JOIN Job_Title AS jobTitle
    ON jobTitle.Job_Title_ID = emp.Job_Title_ID
    ORDER BY emp.Record_Active DESC,
                 emp.First_Name ASC
    

    使用Join 总是比使用Sub Query 更好。

    已编辑:

    由于Employee_Reports_To 列可以是null,因此最好使用LEFT JOIN 而不是INNER JOIN。像这样:

    SELECT emp.*,
               manager.First_Name, 
               manager.Last_Name,
               departments.Department_Name, 
               jobTitle.Job_Title
    FROM Employee emp
    LEFT JOIN Employee manager                     --Changed Join here
    ON emp.Employee_Reports_To = manager.Employee_ID
    LEFT JOIN Departments AS departments
    ON departments.Departments_ID = emp.Departments_ID
    LEFT JOIN Job_Title AS jobTitle
    ON jobTitle.Job_Title_ID = emp.Job_Title_ID
    ORDER BY emp.Record_Active DESC,
             emp.First_Name ASC
    

    【讨论】:

    • 我把它作为一个连接而不是一个子查询,但是它只在 Employee_Reports_To 列中有值时才显示数据(因此它丢失了 120 条记录)。 isnull 包装似乎也不起作用,这是因为加入吗?
    • @AisRuss 是的,这是因为INNER JOIN,在你的情况下使用LEFT JOIN。我编辑了我的解决方案,看看并告诉我它是否解决了您的问题。
    • 非常感谢!我绞尽脑汁想弄清楚是什么原因造成的,但谢谢!
    【解决方案2】:

    查看您的代码,您可以使用两次 Employee(别名 e1 和 e2)一次用于员工,一次用于相关经理

    SELECT e1.*
      , departments.Department_Name
      , jobTitle.Job_Title
      , e2.First_Name
      ,e2.Last_Name
      FROM Employee e1
      INNER JOIN Employee e2 ON e1.Employee_Reports_To = e2.Employee_ID
      LEFT JOIN Departments AS departments
          ON departments.Departments_ID = e1.Departments_ID
      LEFT JOIN Job_Title AS jobTitle
          ON jobTitle.Job_Title_ID = e1.Job_Title_ID
       ORDER BY e1.`Record_Active` DESC,
               e1.`First_Name` ASC
    

    【讨论】:

    • 哦,天哪,我没有意识到它是如此简单!谢谢!!
    猜你喜欢
    • 2019-05-11
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多