質問
私は私のSQLが
最大ではないと私と一緒にご負担ください...私はこの1つで正しい道を下って行くと思います私は、特定の細胞が他に存在しない一つのテーブルからすべてを選択するためのデータベースを照会しようとしています。それだけ多くの意味がありませんが、私は願っていたコードのこの作品は
SELECT * from employees WHERE NOT EXISTS (SELECT name FROM eotm_dyn)
だから、基本的に私は、従業員とその詳細のリストで一つのテーブルを持っています。そして、自分の名前を含むいくつかのその他の詳細、と別のテーブル。そこに名前が彼らのためにエントリが存在しないという意味、eotm_dynテーブルにない場合は、私は彼らがしている、または他の言葉で、正確に欠けているものを参照してください正確に誰が見たいと思います。
上記のクエリは何も返しませんが、私は行方不明20ish名前がある知っているので、私は明らかに右のそれを得ていませんでした。
誰が助けることはできますか?
解決
あなたはあなたのクエリ内のテーブルに参加しませんでした。
それがすべてを返します。その場合には全く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
を使用するよりも効率的になることができます。
他のヒント
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
あなたはLEFT JOINをし、結合列がNULLである主張を行うことができます。
例:
SELECT * FROM employees a LEFT JOIN eotm_dyn b on (a.joinfield=b.joinfield) WHERE b.name IS NULL
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
)
二つのテーブルを外部キー関係によってリンクされていると仮定。この時点では、LEFT JOINを含む他のさまざまなオプションを使用することができます。オプティマイザは通常、しかし、彼らにほとんどの場合、同じを処理します。
また、この関連する質問するを見てすることができます。そのユーザは、サブクエリを使用するよりも参加して優れたパフォーマンスを使用していることを報告します。