1

假设我有 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

问题:如何选择未分配给任何任务的人员?

4

2 回答 2

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

有关的

于 2012-05-02T17:47:09.663 回答
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,因此表明此人未在分配表中找到。

于 2012-05-02T17:49:45.273 回答