31

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

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にすることはできません

どうすればよいですか?

4

4 に答える 4

54

一般に、別のテーブルに存在しない行が必要な場合は、他のテーブルをLEFT JOINし、WHERE ...ISNULLを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

これは、アンチジョインとして知られています。

于 2012-02-20T18:03:55.117 に答える
29

ここで使用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)
于 2012-02-20T18:08:05.710 に答える
5

必要なクエリは次のようになります。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
于 2012-02-20T18:02:41.077 に答える
2
SELECT 
  name,
  id_string
FROM process
WHERE id_string IS NOT NULL AND id_string NOT IN SELECT id_string FROM value_seach
于 2012-02-20T18:02:21.450 に答える