0

サブセレクトを使用して実行できることがわかっているクエリがありますが、テーブルのサイズが大きい (テーブルあたり 100k 行以上) ため、結合を使用して代替手段を見つけたいと考えています。これは宿題の質問ではありませんが、そのような用語で例を共有する方が簡単です.

2 つのテーブルがあるとします:
生徒
:id :名前
1 トム
2 サリー
3 ベン


:id :student_id :book
1 1 数学 101
2 1 歴史
3 2 NULL
4 3 数学 101

歴史の本を持っていないすべての学生を見つけたいです。ワーキング
サブセレクトは:

これにより、Sally と Ben が返されます。

返信ありがとうございます。

4

1 に答える 1

1

問題はパフォーマンスですか?それとも、これはサブクエリを避けるための理論的な (宿題?) 質問ですか? それがパフォーマンスの場合、これは次のとおりです。

SELECT *
FROM studnets s
WHERE NOT EXISTS
(SELECT id FROM books WHERE student_id = s.id AND book = 'History')

MySQL で実行している IN よりもはるかに優れたパフォーマンスを発揮します (他のいくつかのデータベースでは、同等のパフォーマンスを発揮します)。これは、結合として言い換えることもできます。

SELECT s.*
FROM studnets s
LEFT JOIN books b ON s.id = b.student_id AND b.book = 'History'
WHERE b.id IS NULL
于 2009-05-28T22:18:22.270 に答える