選択*存在しない場所


94

私はこれで正しい道を進んでいると思います...私のSQLは最高ではないので、どうか我慢してください

データベースにクエリを実行して、特定のセルが別のセルに存在しないテーブルからすべてを選択しようとしています。それだけではあまり意味がありませんが、このコードがうまくいくことを願っています

SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

したがって、基本的には、従業員とその詳細のリストを含む1つのテーブルがあります。次に、名前など、その他の詳細を含む別のテーブル。名前がeotm_dynテーブルにない場合、つまりそれらのエントリがない場合、それらが正確に誰であるか、つまり、何が欠けているのかを確認したいと思います。

上記のクエリは何も返しませんが、20の名前が欠落していることはわかっているので、明らかに正しくありません。

誰か助けてもらえますか?

回答:


160

クエリでテーブルを結合しませんでした。

にレコードがない場合を除いて、元のクエリは常に何も返しませんeotm_dyn。その場合、すべてが返されます。

これらのテーブルをで結合する必要があると仮定してemployeeID、以下を使用します。

SELECT  *
FROM    employees e
WHERE   NOT EXISTS
        (
        SELECT  null 
        FROM    eotm_dyn d
        WHERE   d.employeeID = e.id
        )

これらのテーブルをLEFT JOINキーワードで結合してを除外できますNULLが、これはを使用するよりも効率が悪い可能性がありますNOT EXISTS


30
「WHERE NOT EXISTS」が年に2回必要ですが、その使い方をいつも忘れてしまいます。ありがとう-この例はブックマークされます。
Mateng 2012

1
誰かが「LEFT JOIN + NULLフィルターはNOT EXISTSよりも効率が悪い」のリファレンスを教えてもらえますか?それは明白かもしれませんが、ドキュメントでそれを見たことはありません。ありがとう。
toni07

2
@ toni07実はそれは伝説です。LEFT JOINが勝ちます。explainextended.com/2009/09/18/... .. Quassnoiさんのブログはいつも役に立つリソースです。
Kaii

これをHAVING句でどのように使用しますか?akagroup by X having exist [row with employeeID = e.id]
phil294 16

@blauhirn:ちょうどそのような
Quassnoi

83
SELECT * FROM employees WHERE name NOT IN (SELECT name FROM eotm_dyn)

または

SELECT * FROM employees WHERE NOT EXISTS (SELECT * FROM eotm_dyn WHERE eotm_dyn.name = employees.name)

または

SELECT * FROM employees LEFT OUTER JOIN eotm_dyn ON eotm_dyn.name = employees.name WHERE eotm_dyn IS NULL

1
NB!NOT IN動作しないなどの場合に予想されるname持っているnull値を。ビデオで36分20秒から見るセッション:すべてのSQLプログラマーが知っておくべき10のクエリチューニングテクニック(Kevin Kline、Aaron Bertrand)
2016

12

LEFT JOINを実行して、結合された列がNULLであることをアサートできます。

例:

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL

7
SELECT * from employees
WHERE NOT EXISTS (SELECT name FROM eotm_dyn)

eotm_dynが空でない限り、レコードを返しません。のSELECT name FROM eotm_dynような何らかの基準が必要です

SELECT * from employees
WHERE NOT EXISTS (
    SELECT name FROM eotm_dyn WHERE eotm_dyn.employeeid = employees.employeeid
)

2つのテーブルが外部キー関係によってリンクされていると仮定します。この時点で、LEFT JOINなどのさまざまなオプションを使用できます。ただし、通常、オプティマイザはそれらをほとんどの場合同じように処理します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.