サブクエリを使用して、ある属性にAテーブルが存在し、Bテーブルが存在しないデータを特定します.
概要
2つのテーブル、
id
name
age
1
xxx
15
2
yyy
18
3
zzz
20
id
b_id
age
1
1
15
2
2
18
ここで、Bテーブルのb_idフィールドは、Aテーブルのidフィールドを参照します.クエリーの要件があります.既知のAテーブルのid、例えばid in(1,2,3)を与えて、これらのidがBテーブルに対応するレコードがないことを見つけます.例えば、上のA表のid=3という記録は、B表にb_がありませんid対応
サブクエリの使用
上のサブクエリを利用すれば目的を達成できます.注意:この
left joinの利用
このブログのあるネットユーザーは別の方法を提供しています(このブログのこのネットユーザーの返事を見てください).ここでこのネットユーザーに感謝します.次は彼の案を貼って、以下のようにします.
これにより、インデックスも使用でき、サブクエリの使用を回避できます.
2つのテーブル、
A
テーブル、B
テーブルがあると仮定します.A
表:id
name
age
1
xxx
15
2
yyy
18
3
zzz
20
B
表:id
b_id
age
1
1
15
2
2
18
ここで、Bテーブルのb_idフィールドは、Aテーブルのidフィールドを参照します.クエリーの要件があります.既知のAテーブルのid、例えばid in(1,2,3)を与えて、これらのidがBテーブルに対応するレコードがないことを見つけます.例えば、上のA表のid=3という記録は、B表にb_がありませんid対応
サブクエリの使用
SELECT
a.id
FROM
A a
WHERE a.id IN (1,2,3)
AND NOT EXISTS
(SELECT
1
FROM
B b
WHERE b.b_id = a.id)
上のサブクエリを利用すれば目的を達成できます.注意:この
SQL
はインデックスに使用できますが、必ず入参の個数に注意してください.入参idの個数が多すぎると、性能に問題があります.このSQL
は、パラメータに基づいて、サブクエリを1つずつ実行し、比較するからです.left joinの利用
このブログのあるネットユーザーは別の方法を提供しています(このブログのこのネットユーザーの返事を見てください).ここでこのネットユーザーに感謝します.次は彼の案を貼って、以下のようにします.
select
a.id
from
A a
left join B b on a.id = b.b_id
where
a.id IN (1, 2, 3)
and b.id is null
これにより、インデックスも使用でき、サブクエリの使用を回避できます.