在Oracle中使用子查询的子句中

时间:2014-03-20 11:17:46

标签: sql oracle plsql oracle11g oracle10g

我有两个表,表示table1和table2,下面有详细信息

create table test1(id number, name varchar2(20)); 
insert into test1 values(11,'micro'); 
insert into test1 values(22,'soft'); 


create table test2(id number, name varchar2(20)); 
insert into test2 values(77,'micro,soft'); 

1)如果我使用下面的查询,我没有选择行

select * from test1 t1 where t1.name in ( select ''''||replace(t2.name,',',''',''')||''''  from test2;

2)如果我单独触发子查询输出,我得到的是:'micro','soft'

select ''''||replace(t2.name,',',''',''')||''''  from test2;

但如果我触发查询(1)我需要结果

id   name
------------
11 micro
22 soft

有人可以帮我用查询(1)得到相同的结果。

2 个答案:

答案 0 :(得分:3)

你有一个非常奇怪的数据布局,应该可以改变它。

您可以使用join或使用like的相关子查询执行您想要的操作:

select *
from test1 t1
where exists (select 1
              from test2 t2
              where ','||t2.name||',' like '%,'||t1.name||',%'
             );

你的版本不起作用,因为表达式:

where x in ('a,b,c')

测试x等于字符串值'a,b,c'的位置,而不是它是否等于三个值中的一个。

答案 1 :(得分:1)

使用REGEXP_SUBSTR功能完成此操作。

SELECT * 
FROM   test1 t1 
WHERE  t1.NAME IN(SELECT regexp_substr(t2.NAME, '[^,]+', 1, ROWNUM) 
                  FROM   test2 t2
                  CONNECT BY LEVEL <= LENGTH (regexp_replace (t2.NAME, '[^,]+'))  + 1
                  );