18

従業員用のテーブルとトレーニング用の別のテーブルがあります。トレーニング テーブルには、従業員が完了したさまざまなトレーニング クラスが含まれています。セキュリティ意識向上トレーニングが義務付けられているため、すべての従業員がこのトレーニング クラスを修了する必要があります。リストされているすべての従業員のトレーニングを完了したかどうかを返すクエリの実行に問題があります。

従業員テーブルの例

╔════╦══════╗
║ 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

「セキュリティ意識」クラスを欠席した従業員は現れず、亀裂から抜け落ちます。

4

5 に答える 5

23
于 2013-03-06T15:50:17.090 に答える
1

内部結合を実行していますが、必要なのは左外部結合です。違いは次のとおりです。内部結合は、結合されたテーブルに一致がある場合にのみ結果が得られます。左外部結合は、結合されたテーブルに結果があるかどうかに関係なく、プライマリ テーブルからすべての結果を返します。

于 2013-03-06T15:48:26.453 に答える
1

JOIN の代わりに LEFT OUTER JOIN を使用します。また、WHERE句を次のように変更します

WHERE training.Id = 1

それが同等なら

于 2013-03-06T15:50:04.087 に答える
0

探しているものは、外部結合と呼ばれます。この場合、左外部結合が必要になります。

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
于 2013-03-06T15:49:00.913 に答える
0
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
于 2013-03-06T15:54:27.703 に答える