繁体   English   中英

Oracle子查询

[英]Oracle Subquery

我需要设计一个子查询来选择列中具有匹配值的行。

Select * 
from person 
where first_name in ('Java','SQL','Oracle');

但是,此括号内的列表可能很大,最多可以有30,000个值。 我将从文件中读取值,并将其传递到此括号内。 但是,我认为括号内可以提供的值数量可能有限制。 是否有一个最佳解决方案来解决这种情况,而无需创建新表并向其中加载数据?

编辑:感谢您的答复。 以下查询是要考虑的一个选项-

Select * 
from person 
where first_name like 'Java' 
   or first_name like 'SQL' 
   or first_name like 'Oracle';

谢谢。

我同意乔纳森(Jonathan)的观点,认为拥有30000个值不是解决问题的办法,而他的解决方案是一个好方法。 但是这是另一个想法,Oracle具有一个很好的功能,称为“外部表”。

使用外部表,您可以将文件视为表。 如果文件结构良好(例如CSV),则可以轻松使用此功能。

Google“ 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中处理文件,则流水线函数可能是另一个选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM