2011-09-29 26 views
39

テーブル内にある行を検索しようとしていますが、両方のテーブルが異なるデータベースにあり、一致する列に異なる列名があります。他のテーブルにないテーブルを選択

私は、クエリ、次のコードを持っている、と私はそれはおそらくうまくいくと思うが、それはあまりにも遅いです:

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

ので、クエリは次のようにやろうとしている:

はすべて選択wpsapi4.product_detailsデータベースにないR2R.partmasterデータベースのID。私が一致している列はpartmaster.idです。& product_details.part_num

+0

私のために存在する/存在しないことは、明示的にあなたが得たいと思っているから最良の方法です。しかし、最も遅い方法であるようです(MySQL上)。これを確認してください:http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ – DavidEG

答えて

64

、あなたも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.idpd.part_numにインデックスを持っている必要があります質問
のフィールドにインデックスを持っていることを確認してください。

+1

あなたの答えをありがとう、それは十分に迅速に動作しませんでしたが、クエリは、私のDB上ではなく、良いです。私は別のsoloutionを働いたが、stackOverflowは私が3時間の時間まで投稿することはできません。 – Drahcir

+1

MySQL 5.1.73aでは、上記のようなクエリに約10分かかりました。 MySQL 5.6.22にアップグレードすると、約456msかかりました。 –

+0

これは私のために働く、良いことは、私はかなり過去、とてもシンプルにそれを理解することができます。 –

44

LEFT JOINで2つのテーブルを作成できます。 2番目のテーブルに対応する行がない場合、値はNULLになります。 Sjoerdの抗参加に拡大

SELECT id FROM partmaster LEFT JOIN product_details ON (...) WHERE product_details.part_num IS NULL 
+4

これは本当に受け入れられた答えでなければなりません。この場合、私はサブセレクトのポイントを見ません:/ –

+2

subselectは、初心者が理解しやすいです。 – Johan

3

このようにする方法を示すウェブ上に多数の記事がありますが、Johan & Sjoerdによって指摘されているのと同じ3つの方法が見つかりました。私はこれらのクエリのいずれかを動作させることができませんでした、明らかに彼らは正常に動作していない私のデータベースであり、それらのクエリはすべて遅く実行されます。

だから私は他の誰かが有用見つけることが別の方法を働いた:

それの基本的なJISTは一時テーブルを作成し、すべての情報とそれを埋める、その後、他にあるすべての行を削除することです表。

私はこれらの3つのクエリを実行し、すぐに(数瞬間に)実行されました。

CREATE TEMPORARY TABLE 

`database1`.`newRows` 

SELECT 

`t1`.`id` AS `columnID` 

FROM 

`database2`.`table` AS `t1` 

CREATE INDEX `columnID` ON `database1`.`newRows`(`columnID`) 

DELETE FROM `database1`.`newRows` 

WHERE 

EXISTS(
    SELECT `columnID` FROM `database1`.`product_details` WHERE `columnID`=`database1`.`newRows`.`columnID` 
) 
+0

最初の製品を比較しているだけなので、速く走っていますか、または私はこの権利を見ていませんか? – MPaulo

2

Johanの回答を拡大するには、サブセレクションのpart_num列にnull値を含めるとクエリが中断されます。ヌルチェックを追加し、これを修正するに

...申し訳ありません

SELECT pm.id FROM r2r.partmaster pm 
WHERE pm.id NOT IN 
     (SELECT pd.part_num FROM wpsapi4.product_details pd 
        and pd.part_num is not null) 
  • が、私は担当者を持っていないように私はコメントを追加することができませんでした!
+1

'not in'は間違いかもしれません – Drew

関連する問題