在Coldfusion中,我正在尝试对我只有读取权限的Oracle数据库表执行选择查询。我有一个列表(让我们称之为myList),我想要查询几千个ID。
SELECT * FROM table
WHERE userID IN (#myList#)
我遇到的问题是Oracle只允许我一次使用1000个项目。什么是最有效的方法来解决这个问题?将列表拆分1000并追加结果查询?如果是这样,我打破列表的代码应该是什么样的?
谢谢!
答案 0 :(得分:2)
cflib.org上有一个名为ListSplit的功能。它将您的长列表拆分为一系列较短的列表。一旦找到并运行它,您的查询就会如下所示:
select JustTheFieldsYouNeed
from SomeTables
where 1 = 3
<cfloop array="#ArrayOfShorterLists#" index = "ThisList">
or SomeField in
(<cfqueryparam cfsqltype="cf_sql_integer" value = "#ThisList#" List = "yes"> )
</cfloop>
答案 1 :(得分:1)
如果您希望针对即席查询执行此操作,可以使用WITH查询来完成此操作:
WITH
UserList AS
(
SELECT 'UserID1' AS UserID FROM DUAL UNION ALL
SELECT 'UserID2' AS UserID FROM DUAL UNION ALL
...
SELECT 'UserIDX' AS UserID FROM DUAL
)
SELECT t.*
FROM table t
JOIN UserList U
ON t.UserID = U.UserID
UserList WITH查询的括号之间的列表可以是您想要的,并且可以非常容易地使用Excel创建(假设您要检查的列表来自哪里)。
-
示例Excel公式(假设您的第一个值在A2中):
="SELECT '" & A2 & "' AS UserID FROM DUAL" & IF(A3="", "", " UNION ALL ")
或者,如果您的UserID是数字:
="SELECT " & A2 & " AS UserID FROM DUAL" & IF(A3="", "", " UNION ALL ")
(将其自动填充到列表底部将创建您需要粘贴在上述查询的括号之间的所有内容)
-
但是,请注意,这仅适用于临时类型查询。如果您需要自动执行此操作,这不是一个好的解决方案。如果这是一个更永久的解决方案,请使用临时(或永久)表。
编辑从这里开始
以下是一些简单的代码,展示了如何在ColdFusion中执行此操作
<cfset ids = "1,2">
<cfquery name="x" datasource="oraclesomething">
with IDList as (
select 0 id
from dual
where 1 = 2
<cfloop list="#ids#" index="ThisID">
union
select #ThisID# id
from dual
</cfloop>
)
select count(*) from some_table join IDList on someid = id
</cfquery>
<cfdump var="#x#" metainfo="no">