2011-07-11 64 views
1

我有以下查詢(MySQL的):MySQL查詢幫助 - 使用=與任何

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

而我也希望這將讓我在數據庫1從表中選擇col1和col2上,其中COL3(仍在database1中)與數據庫2中的表中的col1不等於任何內容。

當然,這不會工作,因爲SELECT COL1 FROM database2.table返回多行,所以如果等於ROW1,那麼它不等於2行,所以它仍然返回。

如何做這正確的方式有什麼想法?

回答

1

使用NOT IN

SELECT COL1,COL2 FROM database1.table - > WHERE COL3 NOT IN(SELECT COL1 FROM database2.table) - > ORDER BY這個,那個;

但請記住,subselect沒有在MySQL中進行過優化,並且如果database1.table中有很多記錄,這將會很慢。更快的方法是使用JOIN - 有很多的例子在SO

+0

我不知道子查詢在MySQL中沒有優化。這是否意味着,如果必要的約束條件可用,那麼沒有查詢轉換工具將「NOT IN」操作轉換爲反連接? –

+0

我也會考慮加入。謝謝!當你執行' – Jason

+0

IN(SELECT ...)'MySQL的執行對在外層一個發現每一行內選擇(而不是進行內部的選擇只有一次,之前外) 所以,你必須寫SELECT COL1 ,COL2,a.col FROM database1.table LEFT JOIN(SELECT COL1 AS山坳FROM database2.table)爲ON(table.col3 = a.col1)WHERE COL IS NULL –

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

完美,謝謝。 – Jason

0

您可以使用NOT IN操作符此 SELECT COL1,COL2 FROM database1.table - > WHERE COL3 NOT IN(SELECT COL1 FROM database2.table ) - > ORDER BY this,that;

0

只需使用ALL代替ANY:

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