2009-01-17 58 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