选择没有关系的记录

时间:2012-05-02 17:45:52

标签: sql oracle

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

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

2 个答案:

答案 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,从而表示在分配表中找不到该人。