【问题标题】:mySQL JOIN statements not returning what I wantedmySQL JOIN 语句没有返回我想要的
【发布时间】:2010-11-13 21:15:50
【问题描述】:

我想显示两个表的“FULL JOIN”,但使用带有外键的中介来创建匹配项。

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

这个查询的问题是第二个“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 */

【问题讨论】:

  • 您能解释一下您要做什么吗?
  • 对不起,如果我没有说清楚:表 Employee1 包含员工的姓名和 ID。表 Projects 包含项目的名称和 ID。表分配使用外键将员工分配给项目。我想在 Employee1 和 Project 表上执行“FULL JOIN”,但必须使用 Assignment 表作为中介。

标签: sql mysql join mysql-error-1064


【解决方案1】:

要在 MySQL 中获得 FULL OUTER JOIN,您需要首先执行 LEFT JOIN,然后执行 RIGHT JOIN 和 UNION 所有结果(或者代替 RIGHT JOIN 反转表并使用另一个 LEFT JOIN)。但要注意的一件事是,在第二次连接中,您需要丢弃连接成功的行,以免结果中出现重复。

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。

【讨论】:

  • 对不起,/* Duplicate */ 表示和原来的一样,不同的别名到底是什么意思? LEFT JOIN Assignment AS temp?
  • 有效的批评,但不能回答如何获得所需输出的问题。
  • 这很有趣,但现在有多个项目的员工多次出现(感谢工会?),没有指定员工的项目没有出现。在第一个选择中进行第二个连接选择“RIGHT JOIN”修复了项目未显示的问题。
  • @J V:如果一个员工有多个项目,并且只允许你返回一行,你希望与那个员工关联哪个项目?任何项目都会做吗?或者您正在寻找某个特定的项目吗?
  • @Mark:我并没有说我只想要一行,只是它给出的行数是它应该有的两倍。没关系,最新的编辑工作,但我想知道是否没有更有效的方法来做到这一点。我将浏览 Drupal Views SQL 以获得一些想法。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多