2009-01-17 243 views

回答

7

也許你會更好用另一種方式來完成您的查詢?

我建議你將匹配值加載到單列表中,然後將正在查詢的列內部連接到新表中的單列。

不是

SELECT a, b, c FROM t1 WHERE d in (d1, d2, d3, d4, ...) 

建立一個臨時表1列,把它稱爲 「DVAL」

 
dval 
---- 
d1 
d2 
d3 
SELECT a, b, c FROM t1 
INNER JOIN temptbl ON t1.d = temptbl.dval 
+0

謝謝你,我們也計劃同樣的解決方案,但在現有的安裝中添加一個新表需要一些額外的驗證和時間 - 因此作爲一個臨時解決辦法,我們想分割查詢。 – 2009-01-19 04:19:22

+0

我不記得mber肯定,但我會認爲臨時表不需要很多權限,因爲它臨時發生在tempdb中。但在短期內,我認爲循環您所確定的是可接受的參數計數是可行的。 – dkretz 2009-01-19 04:46:19

+0

或者,如果您一次都需要它們,則可以對多個語句執行UNION。 – dkretz 2009-01-19 04:47:34

4

不必問有關限制或者做一個SQL查詢或數據庫設計的時候是一個很好的指標,表明你做錯了。

0

我已經使用IN與相當大的ID列表 - 我懷疑內存問題不在查詢本身。你如何檢索結果?

該查詢,例如是從活動網站:

SELECT DISTINCT c.id, c.name FROM categories c 
LEFT JOIN product_categories pc ON c.id = pc.category_id 
LEFT JOIN products p ON p.id = pc.product_id 
WHERE p.location_id IN (
955,891,901,877,736,918,900,836,846,914,771,773,833, 
893,782,742,860,849,850,812,945,775,784,746,1036,863, 
750,763,871,817,749,838,986,794,867,758,923,804,733, 
949,808,837,741,747,954,939,865,857,787,820,783,760, 
911,745,928,818,887,847,978,852 
) ORDER BY c.name ASC 

我的代碼第一遍是極其幼稚和有這些疑問的約10在單頁上,並且數據庫不眨眼。

當然,你可以運行一個100k值的列表,這完全是一個不同的故事。

0

我不知道限制是什麼,但我也遇到過這個問題。我不得不重寫我的查詢是這樣的:

select * from foo 
    where id in (select distinct foo_id from bar where ...) 
2

我只用並不處於當條件是非常小(在100行左右)。它在這些情況下表現良好。當條件很大時,我使用OUTER JOIN,因爲查詢不必爲每個元組查找「IN」條件。你只需要檢查你想要所有行來自哪個表。

對於 「IN」 連接條件IS NOT NULL

對於 「NOT IN」 連接條件IS NULL

例如

/* Get purchase orders that have never been rejected */ 
SELECT po.* 
FROM PurchaseOrder po LEFT OUTER JOIN 
    (/* Get po's that have been rejected */ 
    SELECT po.PurchaesOrderID 
    FROM PurchaseOrder po INNER JOIN 
     PurchaseOrderStatus pos ON po.PurchaseOrderID = pos.PurchaseOrderID 
    WHERE pos.Status = 'REJECTED' 
    ) por ON po.PurchaseOrderID = por.PurchaseOrderID 
WHERE por.PurchaseOrderID IS NULL /* We want NOT IN */ 
0

I「具有類似的問題,但只允許通過100點3位數的ID在我的IN子句米當我看到堆棧跟蹤,它實際上IN子句中切斷逗號分隔值。我不」如果它的相關,我使用symfony框架...我檢查看它是否是一個推動問題,但只是想看看它是否可能是sql