質問

私のテーブルは次のようなものをセットアップしています:

table name: process
fields: name, id_string

table name: value_seach
fields: id_string, value

value_searchにエントリがないすべてのプロセス名(それぞれのID_STRINGを使用)を表示する選択ステートメントを作成したいと思います。

プロセステーブルのID_STRINGは、次の場合があります ヌル, 、まだ名前がありますが、可能であれば除外する必要があります。 value_searchのid_stringは決してありません ヌル

どうすればいいですか?

役に立ちましたか?

解決

一般に、別のテーブルに存在しない行が必要な場合は、他のテーブルに参加し、ここで... 2番目のテーブルの列にnullになります。また、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

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

他のヒント

使っていると信じています 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)

あなたが望むクエリはこのようなものになるはずです。結合は、Where Clauseのサブクエリよりも大幅に高速になることに注意してください。

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
SELECT 
  name,
  id_string
FROM process
WHERE id_string IS NOT NULL AND id_string NOT IN SELECT id_string FROM value_seach
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top