私は2つのテーブルを持っています。表A
とB
. 各テーブルにはbarcode
列があります。
この 2 つをバーコード フィールドで結合できます。私がやりたいのは、テーブル A のどのバーコードが B と結合していないかを調べることです。
例えば:
A には次のものがあります。
001 002 003
Bは:
001 003
002 を戻すクエリが必要です。
それ、どうやったら出来るの?
これはアンチ結合として知られており、MySQL には 3 つのオプションがあります。漠然とした好みの順序で(最も多いものから最も少ないものへ):
OUTER JOIN
とIS NULL
:
SELECT A.barcode
FROM A LEFT JOIN B USING (barcode)
WHERE B.barcode IS NULL
NOT IN
:
SELECT barcode
FROM A
WHERE barcode NOT IN (
SELECT barcode
FROM B
)
NOT EXISTS
:
SELECT barcode
FROM A
WHERE NOT EXISTS (
SELECT *
FROM B
WHERE B.barcode = A.barcode
)
それぞれのパフォーマンスの比較分析については、@Quassnoi のブログ記事NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: MySQLを参照してください。