使用选择列表查询 Oracle
Posted
技术标签:
【中文标题】使用选择列表查询 Oracle【英文标题】:Querying Oracle with a pick list 【发布时间】:2009-06-25 21:09:23 【问题描述】:我有一个只读访问权限的 oracle 数据库(没有创建临时表的权限)。我有一个包含 28000 个 ID 的选择列表(在 Excel 中),对应于具有数百万条记录的表中的 28000 行。如何编写查询以返回 28000 行?
我尝试在 access 中创建一个表并通过 ODBC 执行连接,但 Access 冻结/需要很长时间。我是否必须在 IN 语句中创建一个包含 28,000 个项目的查询?
PL/SQL 中有什么可以让它更简单的吗?
感谢您的时间和帮助。
-JC
【问题讨论】:
【参考方案1】:是什么让您的 28,000 行与众不同?
记录中是否有另一个字段可以用来限制在 WHERE 子句中的查询(或者至少缩小几百万行的范围)?也许您感兴趣的 ID 在某个范围内?
【讨论】:
ID 实际上是电话号码和时间的组合。这几乎就是使该行独一无二的原因。 我相信 Graham 是在问您的 28,000 行与您不感兴趣的表中的数百万行有何区别。您能否设计一个查询来查找不涉及 28 的那 28,000 行一个单独的 1000 个文字的 IN 列表? +1,一针见血。如果您无法对此提出答案,那么您将面临其他人给出的痛苦解决方案之一。 它们确实在某个日期范围内,但数十万条其他记录也是如此。除了使查询更快一点之外,我仍然对这将如何帮助我感到有些困惑。我不是还得写多个 IN 列表吗?【参考方案2】:在 Oracle 10g 中,IN (.., ..,,) 类型查询的最大变量数为 1000。
【讨论】:
【参考方案3】:尝试在您在 Access 中创建的表上创建索引。
【讨论】:
【参考方案4】:这是一种痛苦的状态。一种解决方法是创建一个包含所有 id 的视图,然后加入它。
下面的例子是Oracle。
WITH
ids AS
(
SELECT 314 ID FROM DUAL UNION ALL
SELECT 159 ID FROM DUAL UNION ALL
SELECT 265 ID FROM DUAL
)
SELECT VALUE1, VALUE2
FROM SOME_TABLE, ids
WHERE SOME_TABLE.ID = ids.ID
这基本上将所有 28000 个 id 嵌入到 with 子句中,允许您进行连接,而无需实际创建表。
丑陋,但应该可以。
【讨论】:
【参考方案5】:这里描述了最好的方法:How to put more than 1000 values into an Oracle IN clause
【讨论】:
当您没有对数据库的写入权限时很难做到。 为什么?数据库中没有写入任何内容! 不幸的是,我无权创建临时表 :( @JC,上面链接的示例不需要任何临时表。使用 '...from table(...' 构造!!速度非常快!以上是关于使用选择列表查询 Oracle的主要内容,如果未能解决你的问题,请参考以下文章