值大于1的单元格的嵌套SQL IN语句
如何编写SQL,使其返回给我 汤姆,肯,杰瑞 我尝试了这个SQL作为值大于1的单元格的嵌套SQL IN语句,sql,oracle,listagg,Sql,Oracle,Listagg,如何编写SQL,使其返回给我 汤姆,肯,杰瑞 我尝试了这个SQL作为 select name from staffDB where dept in (select value from ConfigDB where key = 'dept') 但是它不返回值,不,不,我不允许更改数据库设计。您的数据库设计不是最佳的,因为它存储的是CSV值。也就是说,这里有一种使用LISTAGG 11g+获得所需输出的方法: 请注意
select name
from staffDB
where dept in (select value
from ConfigDB
where key = 'dept')
但是它不返回值,不,不,我不允许更改数据库设计。您的数据库设计不是最佳的,因为它存储的是CSV值。也就是说,这里有一种使用LISTAGG 11g+获得所需输出的方法: 请注意,我们使用以下逻辑将配置表中的部门CSV列表与staff表中的每个标量值进行比较,例如:
,A,B,C, LIKE '%,A,%'
也就是说,我们在CSV部门字符串上标记逗号,这样我们可以搜索每个可能的标量部门,每个部门都用逗号括起来。一个选项是用逗号拆分,然后在SELECT中使用LISTAGG函数进行合并。。按级别连接。。声明:
WITH ConfigDB( key, value ) AS
(
SELECT 'dept', 'A,B,C' FROM dual
), StaffDB( name, dept ) AS
(
SELECT 'tom' , 'A' FROM dual UNION ALL
SELECT 'ken' , 'B' FROM dual UNION ALL
SELECT 'jerry', 'C' FROM dual
), t AS
(
SELECT REGEXP_SUBSTR(value,'[^,]',1,level) AS letter, level AS lvl
FROM ConfigDB
CONNECT BY level <= REGEXP_COUNT(value,',') + 1
)
SELECT LISTAGG(name,',') WITHIN GROUP (ORDER BY lvl) AS DBNAme
FROM t
JOIN StaffDB
ON dept = letter
请使用下面的查询
select * from
(select LISTAGG(Name, ',') WITHIN GROUP (ORDER BY Dept) as name,
LISTAGG(Dept, ',') WITHIN GROUP (ORDER BY Dept) as dept from staffDB)
where dept in
(select value from ConfigDB);
下面是测试用例
您可以使用层次结构查询拆分该值,然后按如下方式将其合并:
SQL> SELECT
2 C.KEY,
3 LISTAGG(S.NAME, ',') WITHIN GROUP(ORDER BY S.DEPT) DEPARTMENTS
4 FROM
5 CONFIGDB C
6 CROSS JOIN TABLE ( CAST(MULTISET(
7 SELECT REGEXP_SUBSTR(C.VALUE, '[^,]+', 1, LEVEL)
8 FROM DUAL
9 CONNECT BY LEVEL <= REGEXP_COUNT(C.VALUE, '[^,]+')
10 ) AS SYS.ODCIVARCHAR2LIST) ) C1
11 LEFT JOIN STAFFDB S ON S.DEPT = C1.COLUMN_VALUE
12 GROUP BY C.KEY;
KEY DEPARTMENTS
----- ---------------
dept tom,ken,jerry
SQL>
SQL> SELECT
2 C.KEY,
3 LISTAGG(S.NAME, ',') WITHIN GROUP(ORDER BY S.DEPT) DEPARTMENTS
4 FROM
5 CONFIGDB C
6 CROSS JOIN TABLE ( CAST(MULTISET(
7 SELECT REGEXP_SUBSTR(C.VALUE, '[^,]+', 1, LEVEL)
8 FROM DUAL
9 CONNECT BY LEVEL <= REGEXP_COUNT(C.VALUE, '[^,]+')
10 ) AS SYS.ODCIVARCHAR2LIST) ) C1
11 LEFT JOIN STAFFDB S ON S.DEPT = C1.COLUMN_VALUE
12 GROUP BY C.KEY;
KEY DEPARTMENTS
----- ---------------
dept tom,ken,jerry
SQL>