1. ホーム
  2. mysql

あるテーブルから別のテーブルにないものを選択する

2023-11-22 09:34:04

質問

あるテーブルにあり、別のテーブルにない行を見つけようとしています。両方のテーブルは異なるデータベースにあり、私がマッチングに使用しているカラムのカラム名も異なっています。

私はクエリ、以下のコードを持っています、そして、私はそれがおそらく動作すると思いますが、それはあまりにも遅いです。

SELECT `pm`.`id`
FROM `R2R`.`partmaster` `pm`
WHERE NOT EXISTS (
    SELECT * 
    FROM `wpsapi4`.`product_details` `pd`
    WHERE `pm`.`id` = `pd`.`part_num`
)

つまり、このクエリは以下のようにしようとしているのです。

R2R.partmasterデータベースから、wpsapi4.product_detailsデータベースにないすべてのidを選択します。私がマッチさせるカラムはpartmaster.id & product_details.part_numです。

どのように解決するのですか?

Sjoerdのanti-joinを発展させ、わかりやすい SELECT WHERE X NOT IN (SELECT) パターンを使用することもできます。

SELECT pm.id FROM r2r.partmaster pm
WHERE pm.id NOT IN (SELECT pd.part_num FROM wpsapi4.product_details pd)

を使うだけであることに注意してください。 ` を使う必要があるのは、予約語やスペースを含む名前だけで、通常のカラム名には使わないことに注意してください。

MySQL 5+ では、この種のクエリはかなり高速に実行されます。

MySQL 3/4 では遅いです。

問題のフィールドにインデックスがあることを確認します。

にインデックスを持つ必要があります。 pm.id , pd.part_num .