web-dev-qa-db-ja.com

アイテムが別のテーブルに存在しないかどうかを確認する

私のテーブルは次のように設定されています。

table name: process
fields: name, id_string

table name: value_seach
fields: id_string, value

Value_searchにエントリを持たないすべてのプロセス名(それぞれのid_string)を表示するselectステートメントを作成します。

プロセステーブルのid_stringはnullで、名前を保持できますが、可能であれば除外する必要があります。 value_searchのid_stringをnullにすることはできません

どうすればいいですか?

27
user906153

一般に、別のテーブルに存在しない行が必要な場合は、他のテーブルを左に結合し、WHERE ... IS NULLを2番目のテーブルの列に追加します。 process.id_stringがNULLの行は必要ありません。

SELECT p.name, p.id_string
FROM
    process p
    LEFT JOIN value_search v
        ON v.id_string = p.id_string
WHERE
    v.id_string IS NULL
    AND p.id_string IS NOT NULL

これは、反結合として知られています。

41
zgpmax

Not Existsは、ここでの最良の選択肢です。

SELECT p.name, p.id_string
FROM process p
WHERE 
   NOT p.id_string IS NULL AND
   NOT EXISTS(
          SELECT NULL
          FROM value_search v
          WHERE p.id_string = v.id_string)
27
Magnus

必要なクエリは次のようになります。 JOINは、WHERE句のサブクエリよりも大幅に高速であることに注意してください。

SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
   ON p.id_string = v.id_string
   AND p.id_string IS NOT NULL
   AND v.id_string IS NULL

上記のクエリの同等に有効なバリアントは次のとおりです。

SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
   ON p.id_string = v.id_string
WHERE
   p.id_string IS NOT NULL
   AND v.id_string IS NULL
4
Brian Driscoll
SELECT 
  name,
  id_string
FROM process
WHERE id_string IS NOT NULL AND id_string NOT IN SELECT id_string FROM value_seach
2
alexsuslin