[英]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.