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行上的
中的
可能不如内部联接那样有效。对不同的查询进行基准测试是值得的。