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アプローチは機能しますが、読みやすいと思われるアプローチがさらに2つあります。

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テーブルはインデックス検索に基づいて2番目に結合されたONCEを通過します。実際には、2番目の「Assigns」ファイル全体にクエリを実行して、結合する可能性があるすべての可能性を照会するわけではありません(必ずしもインデックスを利用する必要はありません)。左結合はインデックスを直接利用し、レコードを見つけるか、見つけないかのどちらかです。そうでない場合、PIDはNULLになり、その人が割り当てテーブルに見つからないことを示します。

于 2012-05-02T17:49:45.273 に答える