簡體   English   中英

SQL查詢一對多的關系

[英]SQL query one to many relationship

我有一個Employees表和另一個Training表。 培訓表包含員工已完成的各種培訓課程。 我們有強制性的安全意識培訓,因此每位員工都必須完成此培訓課程。 我在運行查詢時遇到問題,該查詢將返回列出完成培訓的所有員工。

示例員工表

╔════╦══════╗
║ ID ║ NAME ║
╠════╬══════╣
║  1 ║ Bob  ║
║  2 ║ Tom  ║
║  3 ║ John ║
╚════╩══════╩

示例培訓表

╔════╦══════════════╦════════════════════╗
║ ID ║ DEPARTMENT_ID║       CLASS        ║
╠════╬══════════════╬════════════════════╣
║  1 ║           1  ║ Security Awareness ║
║  2 ║           1  ║ Workplace Safety   ║
║  3 ║           2  ║ Security Awareness ║
╚════╩══════════════╩════════════════════╝

目標結果

╔════╦══════╦════════════════════╗
║ ID ║ NAME ║       CLASS        ║
╠════╬══════╬════════════════════╣
║  1 ║ Bob  ║ Security Awareness ║
║  2 ║ Tom  ║ Security Awareness ║
║  3 ║ John ║ (null)             ║
╚════╩══════╩════════════════════╝

我正在使用的查詢是

SELECT employee.id, employee.name, training.class
FROM employee
JOIN training ON employee.id = training.department_id
WHERE training.class LIKE '%SECURITY%'
ORDER BY employee_id

錯過“安全意識”課程的員工似乎沒有出現,並且陷入了困境。

使用LEFT JOIN並在連接表時移動過濾條件( 特別是在ON子句中

另一個問題是使用單引號: ' '' '

SELECT  employee.id, 
        employee.name, training.class
FROM    employee   
        LEFT JOIN training 
            ON employee.id = training.department_id AND
                training.class LIKE '%SECURITY%'
ORDER   BY employee.id

結果

╔════╦══════╦════════════════════╗
║ ID ║ NAME ║       CLASS        ║
╠════╬══════╬════════════════════╣
║  1 ║ Bob  ║ Security Awareness ║
║  2 ║ Tom  ║ Security Awareness ║
║  3 ║ John ║ (null)             ║
╚════╩══════╩════════════════════╝

您正在執行內連接,您想要的是左外連接。 不同之處在於: 只有在連接表中存在匹配項時才會生成內部聯接。 左外連接將返回主表中的所有結果,無論連接表中是否有結果。

而不是JOIN使用LEFT OUTER JOIN。 我也將你的WHERE子句改為

WHERE training.Id = 1

如果這相當於

您正在尋找的是一個外部加入。 在這種情況下,您將需要左外連接:

SELECT employee.id, employee.name, training.class 
FROM employee LEFT OUTER JOIN training ON employee.id = training.department_id 
WHERE training.class LIKE '%Security%'
ORDER BY employee_id
Select e.id, e.name, t.class from employee e left outer join training t on e.id = t.department_id where t.class like '%Security%' order by e.id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM