111

私はこれで正しい道を進んでいると思います...私のSQLは最高ではないので、ご容赦ください

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

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

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

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

誰でも助けることができますか?

4

5 に答える 5

176

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

にレコードがまったくない場合を除き、元のクエリは常に何も返しません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

于 2009-05-27T13:19:17.007 に答える
87
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
于 2009-05-27T13:20:41.870 に答える
13

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

例:

SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL
于 2009-05-27T13:19:59.313 に答える
8
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つのテーブルが外部キー関係によってリンクされていると仮定します。この時点で、LEFTJOINを含む他のさまざまなオプションを使用できます。ただし、オプティマイザは通常、ほとんどの場合同じように処理します。

于 2009-05-27T13:24:26.280 に答える
4

この関連する質問もご覧ください。そのユーザーは、結合を使用すると、サブクエリを使用するよりもパフォーマンスが向上すると報告しました。

于 2009-05-27T13:26:17.633 に答える