サブクエリを使用して、ある属性にAテーブルが存在し、Bテーブルが存在しないデータを特定します.

2016 ワード

概要
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

これにより、インデックスも使用でき、サブクエリの使用を回避できます.