假设我有3张桌子:
People
-------------
PID | NAME
-------------
1 Bob
2 Garry
3 Alex
4 Peter
5 Victor
Tasks
-------------
TID | TASK
-------------
1 Work
2 Work Hard
3 Work Harder
将任务分配给人员的表格
Assigns
-------------
PID | TID
-------------
1 2
2 1
4 3
问题: 如何选择未分配给任何任务的人员?
答案 0 :(得分:5)
LEFT JOIN
方法可行,但您可能会发现另外两种方法更容易理解:
<强> 1。不在
SELECT NAME
FROM People
WHERE PID NOT IN
(
SELECT PID
FROM Assigns
)
<强> 2。不存在
SELECT NAME
FROM People
WHERE NOT EXISTS
(
SELECT *
FROM Assigns
WHERE People.PID = Assigns.PID
)
<强>结果强>
Alex
Victor
相关强>
答案 1 :(得分:2)
使用NOT IN子选择可能比LEFT-JOIN更难打击并期望NULL
SELECT NAME
FROM People
LEFT JOIN Assigns
on People.PID = Assigns.PID
where
Assigns.PID IS NULL
通过使用LEFT-JOIN方法,People表将通过ONCE与第二个基于索引查找的连接进行。它实际上并不查询整个第二个“Assigns”文件以获取所有可能性然后加入(并且不一定利用索引)。左连接直接使用索引并找到记录或不记录。如果没有,则PID将为NULL,从而表示在分配表中找不到该人。