2011-07-11 1 views
1

で、私は次のクエリ(MySQLの)持っている:MySQLのクエリのヘルプ - 使い方= ANY

SELECT col1, col2 FROM database1.table 
    ->WHERE col3 != ANY(SELECT col1 FROM database2.table) 
    ->ORDER BY this, that; 

をそして、私はこれがどこcol3という(まだ私はDATABASE1内のテーブルからcol1とcol2のを選択することができるようになる期待していました! in database1)は、database2のテーブルのcol1のものと等しくありません。

SELECT col1 FROM database2.tableは複数の行を返すので、当然これはうまくいかないため、row1と等しい場合はrow2と等しくないため、返されます。

これは正しい方法ですか?

答えて

1

使用NOT IN

のSELECT COL1、database1.table FROM col2に - > col3というNOT IN(database2.table FROM COL1を選択) - > ORDER BYこれ、それを。

ただし、副選択はMySQLでは最適化されていないことに注意してください。また、database1.tableに大量のレコードがある場合、これは遅くなることに注意してください。例が多いSO

+0

MySQLでsubselectが最適化されていないことはわかりませんでした。つまり、必要な制約が利用可能な場合、NOT IN操作を反結合に変換するクエリ変換機能はありませんか? –

+0

私もJOINを見ていきます。ありがとうございました! – Jason

+0

'IN(SELECT ...)'を実行しているときに、MySQLは外側のもので見つかった各行の内部選択を実行します(外側の前に内部選択をただ1回実行するのではなく) SELECT col1 、col2、a.col FROM database1.table ON(table.col3 = a.col1)のようにLEFT JOIN(col1をデータベースから選択してcol2を選択) –

1
WHERE col3 NOT IN (SELECT col1 FROM database2.table) 
+0

パーフェクト、ありがとうございました。 – Jason

0

であなたが database1.table FROMこの のSELECT COL1、COL2のためのオペレータではありません使用することができます - - より高速な方法はJOINを使用することです> WHERE col3というNOT IN(database2.table FROM COL1を選択) - >これで、それ;

0

はただのすべての代わりに使用します。

SELECT col1, col2 FROM database1.table 
WHERE col3 != ALL(SELECT col1 FROM database2.table) 
ORDER BY this, that;