代码之家  ›  专栏  ›  技术社区  ›  J V

mySQL JOIN语句没有返回我想要的

  •  2
  • J V  · 技术社区  · 14 年前

    我想显示两个表的“完全连接”,但是使用带外键的中介来创建匹配。

    这应该显示所有员工及其正在处理的项目的列表,并显示没有项目或没有员工的项目的任何员工。

    这个查询的问题是第二个“RIGHT JOIN”覆盖第一个“LEFT JOIN”。我第二次尝试“完全加入”都失败了。(1064语法错误,真实描述性)

    SELECT EMP_LNAME, EMP_FNAME, Project.PROJ_NAME
    FROM Employee1
    LEFT JOIN Assignment ON Employee1.EMP_CODE = Assignment.EMP_CODE
    FULL JOIN Project ON Assignment.PROJ_CODE = Project.PROJ_CODE
    ORDER BY Employee1.EMP_LNAME /* Syntax error */
    

    我试过的第二种类型

    SELECT EMP_LNAME, EMP_FNAME, Project.PROJ_NAME
    FROM Employee1
    LEFT JOIN Assignment ON Employee1.EMP_CODE = Assignment.EMP_CODE
    RIGHT JOIN Project ON Assignment.PROJ_CODE = Project.PROJ_CODE
    ORDER BY Employee1.EMP_LNAME /* Right join overwrites original left join */
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   Mark Byers    14 年前

    要在MySQL中获得完整的外部连接,您需要首先执行左连接,然后执行右连接并合并所有结果(或者用另一个左连接来代替右连接来反转表并使用另一个左连接)。但有一点需要注意,在第二个连接中,您需要丢弃连接成功的行,这样您就不会在结果中得到重复的行。

    SELECT EMP_LNAME, EMP_FNAME, Project.PROJ_NAME
    FROM Employee1
    LEFT JOIN Assignment ON Employee1.EMP_CODE = Assignment.EMP_CODE
    LEFT JOIN Project ON Assignment.PROJ_CODE = Project.PROJ_CODE
    UNION ALL
    SELECT EMP_LNAME, EMP_FNAME, Project.PROJ_NAME
    FROM Project
    LEFT JOIN Assignment ON Assignment.PROJ_CODE = Project.PROJ_CODE
    LEFT JOIN Employee1 ON Employee1.EMP_CODE = Assignment.EMP_CODE
    WHERE Employee1.ID IS NULL
    ORDER BY EMP_LNAME
    

    我在这里假设你的 Employee1 表具有不可为空的字段调用ID。

        2
  •  2
  •   OMG Ponies    14 年前

    MySQL doesn't support "FULL" in it's JOIN syntax ,你所追求的就是 FULL OUTER JOIN .

    这是 one of the means to get the output you desire :

        SELECT e.emp_lname,
               e.emp_fname,
               p.project_name
          FROM EMPLOYEE e
     LEFT JOIN ASSIGNMENT a ON a.emp_code = e.emp_code
          JOIN PROJECT p ON p.proj_code = a.proj_code
    UNION
       SELECT e.emp_lname,
               e.emp_fname,
               p.project_name
          FROM EMPLOYEE e
    RIGHT JOIN ASSIGNMENT a ON a.emp_code = e.emp_code
          JOIN PROJECT p ON p.proj_code = a.proj_code
    ORDER BY emp_lname