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

发布于 2024-10-02 06:52:01 字数 753 浏览 0 评论 0原文

我想显示两个表的“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 */

I want to display a "FULL JOIN" of two tables, but using an intermediary with foreign keys to create the matches.

This should show a list of all employees with the projects they are working on, and show any employees without projects, or projects without employees.

The problem with this query is that the second, "RIGHT JOIN" overrides the first "LEFT JOIN". All my attempts at a "FULL JOIN" the second time have failed. (1064 syntax error, real descriptive)

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 */

The second type I tried

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 */

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

回梦 2024-10-09 06:52:01

要在 MySQL 中获得 FULL OUTER JOIN,您需要首先执行 LEFT JOIN,然后执行 RIGHT JOIN 并 UNION ALL 结果(或者代替 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。

To get a FULL OUTER JOIN in MySQL you need to first perform a LEFT JOIN and then a RIGHT JOIN and UNION ALL the results (or instead of a RIGHT JOIN reverse the tables and use another LEFT JOIN). But one thing to be careful of is that in the second join you need to discard rows for which the join succeeds so that you don't get duplicates in the result.

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

I'm assuming here that your Employee1 table has a field call ID that is not nullable.

深居我梦 2024-10-09 06:52:01

MySQL 的 JOIN 语法不支持“FULL”,你所追求的具体称为 完全外部连接

这是之一获得所需输出的方法

    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

MySQL doesn't support "FULL" in it's JOIN syntax, what you're after specifically is called a FULL OUTER JOIN.

This is 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文