2013-06-12 143 views
5

我運行的查詢包含相同的子查詢在WHERE子句中多次使用。在單個查詢中多次使用相同的子查詢

我有一張桌子有兩個字段client_id,buyer_id

子查詢返回要從結果中排除的日期列表。

這就是我如何使用它。

SELECT 
    id, client_id, buyer_id 
FROM relation 
WHERE 
    client_id NOT IN (SELECT <some_id> FROM <some_table> WHERE ...) 
    AND buyer_id NOT IN (SELECT <some_ids> FROM <some_table> WHERE ...) 

這是按預期工作,但有什麼困擾我,有兩個相同的子查詢。我想知道是否有一種方法可以使用它,並在兩個地方使用結果。

謝謝。形式的

+0

你嘗試用JOIN代替子查詢? – Taryn

+0

@bluefeet,我已經簡化了這個查詢很長的路只是爲了給你真正的問題。另外我無法理解'JOIN'的'ON'子句是怎麼樣的。 –

回答

3

可以使用NOT EXISTS這樣寫:

SELECT 
    id, client_id, buyer_id 
FROM relation AS r 
WHERE NOT EXISTS 
     (SELECT 1 
     FROM <some_table> 
     WHERE (r.client_id = <some_id> OR r.buyer_id = <some_id>) 
      AND ... 
    ) ; 
+0

我在類似的查詢中出現'錯誤相關字段'異常。 – serdar

1

查詢:

select ... 
from <main query> 
where <select field> not in (select <subquery field> from <subquery>) 

通常可以改寫爲:

select <main query fields> 
from <main query> 
left join <subquery> on <select field> = <subquery field> 
where <subquery field> is null 

如果您正在使用子查詢是正是兩個CLIENT_ID和buyer_id一樣的,因此應該可以將您的查詢重新表述爲:

SELECT id, client_id, buyer_id 
FROM relation 
LEFT JOIN <some_table> ON <some_id> IN (client_id, buyer_id) 
WHERE <some_id> IS NULL 

- 因此有效地在查詢中僅使用子查詢一次。

+0

帶連接的解決方案可能不會返回與使用子查詢的解決方案相同的結果。 –

+0

正是我所經歷的。它不是返回相同的行,而是更多的行。也需要額外的時間。我的原始查詢在41秒內運行,當我在JOIN中使用它時,它花費了61秒。 –

+1

@TalhaAhmedKhan你能提供一個[SQL-Fiddle](http://sqlfiddle.com/)的一些數據嗎?我確實認爲這個查詢等同於你所擁有的(如果'client_id'和'buyer_id'列不能爲空。) –

0

你的查詢可以轉化爲:

SELECT 
    id, client_id, buyer_id 
FROM relation 
LEFT JOIN some_table 
) AS subquery ON (subquery.some_id IN (client_id, buyer_id) AND <condition that was in your subquery>) 
WHERE subquery.some_id IS NULL; 

但我有這仍然會在執行時間方面執行得非常糟糕的感覺。

考慮構建一個包含子查詢內容的臨時表。

0

試圖將提取的值放入單獨的數據庫表中,以便在已經將結果放在單獨的表中時,可以決定是否存在類似的結果值或不同的值。等待聽取您的訴訟...祝您好運。

相關問題