Sql Oracle子查询
我需要设计一个子查询来选择列中具有匹配值的行 范例Sql Oracle子查询,sql,oracle,subquery,Sql,Oracle,Subquery,我需要设计一个子查询来选择列中具有匹配值的行 范例 Select * from person where first_name in ('Java','SQL','Oracle'); 但是,括号内的列表可能很大,最多可达30000个值。我将从文件中读取值,并将其传递到括号中。然而,我认为在括号内可以提供的值的数量可能有限制。是否有一个最佳的解决方案来解决这种情况,而无需创建和加载包含数据的新表 编辑:谢谢你的回复。下面的查询是需要考虑的选项吗- Select * from person
Select *
from person
where first_name in ('Java','SQL','Oracle');
但是,括号内的列表可能很大,最多可达30000个值。我将从文件中读取值,并将其传递到括号中。然而,我认为在括号内可以提供的值的数量可能有限制。是否有一个最佳的解决方案来解决这种情况,而无需创建和加载包含数据的新表
编辑:谢谢你的回复。下面的查询是需要考虑的选项吗-
Select *
from person
where first_name like 'Java'
or first_name like 'SQL'
or first_name like 'Oracle';
谢谢。我同意Jonathan的观点,将30000个值放在一起不是一个好办法,他的解决方案是一个好办法。但是这里有另一个想法,Oracle有一个很好的特性,叫做外部表 对于外部表,可以将文件视为表。如果文件结构良好(如CSV),则可以轻松使用此功能 在谷歌上搜索“Oracle外部表”,你会发现很多信息和示例,但对于初学者来说: 基本上,您需要一个目录对象来告诉Oracle您的文件位于何处,然后您将创建外部表,可能如下所示:
create directory DIR_MYFILE as '/my_source_dir/';
create table EXT_MY_FILE
(
some_id number(8),
some_value varchar2(100)
)
organization external
( default directory DIR_MYFILE
access parameters
( records delimited by newline
fields terminated by ','
)
location ('my_file.csv')
);
在查询中使用此表:
select * from person where first_name in (select some_value from EXT_MY_FILE);
编辑:参见APC的评论,他有一个很好的观点。如果您可以用PL/SQL处理文件,管道函数可能是另一种选择。在in列表中只能有1000个值。30000个值可能根本无法有效处理。您最好将它们加载到表中,并让DBMS充分使用其优化器。您可以编写的SQL的大小可能有一个上限;30000个值可能会超过这个限制。请记住,外部表为我们提供了完整的SQL语法。30000行上的
中的可能不如内部联接那样有效。对不同的查询进行基准测试是值得的。