2010-11-13 54 views
2

我想顯示兩個表的「FULL JOIN」,但使用帶有外鍵的中介來創建匹配。mySQL 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 */ 
+1

你能解釋一下你想幹什麼? – 2010-11-13 21:24:32

+0

對不起,如果我沒有說清楚: 表Employee1具有員工的姓名和ID。 表項目包含項目的名稱和ID。 表分配使用外鍵將員工分配給項目。 我想對Employee1和Project表執行「FULL JOIN」,但必須使用Assignment表作爲中介。 – 2010-11-13 21:36:19

回答

3

爲了得到一個完整的OUTER JOIN在MySQL中,你需要先進行LEFT 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是不能爲空。

+0

對不起,/ * Duplicate * /表示與原始文件相同,您是什麼意思不同的別名?左加入分配AS溫度? – 2010-11-13 21:29:01

+0

有效的批評,但不是如何獲得所需輸出問題的答案。 – 2010-11-13 21:33:55

+0

這很有趣,但現在有多個項目的員工多次出現(感謝工會?),而沒有指派員工的項目不會顯示出來。在第一次進行第二次加入時選擇了「RIGHT JOIN」,但是該項目的問題並未顯示出來。 – 2010-11-13 21:42:54

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