当IN或NOT IN的条件非常大时,我的应用程序出现内存异常。我想知道这有什么限制。
答案 0 :(得分:8)
也许你会用另一种方式来完成你的查询会更好吗?
我建议您将匹配值加载到单列表中,然后将要查询的列内部连接到新表中的单个列。
而不是
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
答案 1 :(得分:4)
在进行SQL查询或数据库设计时,不得不询问限制,这是一个很好的指示,表明你做错了。
答案 2 :(得分:3)
当条件非常小(大约100行左右)时,我只使用IN和NOT IN。它在这些情况下表现良好。当条件很大时我使用OUTER JOIN,因为查询不必为每个元组查找“IN”条件。您只需检查您希望所有行都来自的表。
对于“IN”,连接条件为IS NOT NULL
对于“NOT IN”,连接条件为IS NULL
e.g。
/* 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 */
答案 3 :(得分:1)
我有一个类似的问题但只在我的IN子句中传递了100个3位数字。当我查看堆栈跟踪时,它实际上切断了IN子句中逗号分隔的值。我没有得到错误,我只是没有得到所有结果返回。有没有人之前有这样的问题?如果相关,我正在使用symfony框架......我正在检查它是否是一个推进问题,但只是想要看看它是否可以是sql
答案 4 :(得分: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值的列表,这些列表将完全不同。
答案 5 :(得分:0)
我不知道限制是什么,但我之前也遇到过这个问题。我不得不重写我的查询:
select * from foo
where id in (select distinct foo_id from bar where ...)