1

テーブルA、B、Cがあります。ここで、Aは、Cに格納された0個以上のサブアイテムを持つことができるアイテムを表します。Bテーブルには、AとCを接続するための2つの外部キーしかありません。

私はこのSQLクエリを持っています:

select * from A
where not exists (select * from B natural join C where B.id = A.id and C.value > 10);

つまり、「すべてのサブアイテムの値が10未満であるテーブルAのすべてのアイテムを教えてください。

これを最適化する方法はありますか?existsそして、演算子を使用せずにこれを書く方法はありますか?

4

1 に答える 1

1

値が1つのテーブルにあるが、別のテーブルにはないかどうかをテストするために一般的に使用される3つの方法があります。

  • 存在しない
  • ありませんで
  • LEFT JOIN ... WHERE ... IS NULL

あなたはすでに最初のコードを示しました。これが2番目です:

SELECT *
FROM A
WHERE id NOT IN (
    SELECT b.id
    FROM B
    NATURAL JOIN C
    WHERE C.value > 10
)

そして左結合で:

SELECT *
FROM A
LEFT JOIN (
    SELECT b.id
    FROM B
    NATURAL JOIN C
    WHERE C.value > 10
) BC
ON A.id = BC.id
WHERE BC.id IS NULL

データベースのタイプとバージョンに応じて、3つの異なる方法により、異なるパフォーマンス特性を持つ異なるクエリプランが生成される可能性があります。

于 2010-06-06T23:07:49.587 に答える