我从VB6应用程序对Access 2010数据库执行查询。 SQL看起来像这样:
SELECT *, NetPrice AS Price
FROM Products
WHERE Len(ProductName)<>0 AND ProductID IN (1,5,8,13);
以下代码执行查询:
Set ResultRecordset = myDataBase.OpenRecordset(SqlCode, dbOpenSnapshot)
到目前为止,一切都很好,但是当List中的ID数量增加到大约50时,则ResultRecordset为Nothing
。我发现了Access here的一些限制,但是我远远低于那里提供的值(1个表,200个字符的查询长度,没有嵌套的子查询,......)。有什么想法会出错吗?
答案 0 :(得分:1)
我相信Filburt实际上更符合你的IN(在列表中大约50个)部分查询的目标。我知道在FoxPro中(并回到这个),它也支持IN()子句。但是,IN功能仅用于接受列表中最多20个参数。如果你想做更多的事情,你需要将它分成多个IN()语句,每个语句之间有OR ...例如
where
ProductID IN ( 1, 2, 20, 32, ...)
OR ProductID IN (46, 50, 52, ...)
通过拆分他们可能就是你所经营的。
答案 1 :(得分:0)
您可以在查询中尝试UNION ALL运算符,以便发送给Access的查询是这样的:
SELECT *, NetPrice AS Price
FROM Products
WHERE Len(ProductName)<>0 AND ProductID IN (1,2,3,4,5,6,7,8,9)
Union All
SELECT *, NetPrice AS Price
FROM Products
WHERE Len(ProductName)<>0 AND ProductID IN (10,11,12,13,14,15,16)
这应该允许您的查询运行得更快,假设您的ProductID列已编入索引。
答案 2 :(得分:0)
我找到了一个解决方案:
SqlCode="SELECT *, NetPrice AS Price FROM Products WHERE Len(ProductName)<>0"
Set TempRecordset = myDataBase.OpenRecordset(SqlCode, dbOpenSnapshot)
TempRecordset.Filter="ProductID IN (1,2,..,50)"
Set ResultRecordset=TempRecordset.OpenRecordset