데이터중 교집합인 부분만 조회하고자 합니다.
WITH T AS (
SELECT 1 AS ID, 'A' AS NM FROM DUAL UNION ALL
SELECT 2 AS ID, 'A' AS NM FROM DUAL UNION ALL
SELECT 3 AS ID, 'A' AS NM FROM DUAL UNION ALL
SELECT 1 AS ID, 'B' AS NM FROM DUAL UNION ALL
SELECT 2 AS ID, 'B' AS NM FROM DUAL UNION ALL
SELECT 3 AS ID, 'B' AS NM FROM DUAL UNION ALL
SELECT 1 AS ID, 'C' AS NM FROM DUAL UNION ALL
SELECT 2 AS ID, 'C' AS NM FROM DUAL UNION ALL
SELECT 1 AS ID, 'D' AS NM FROM DUAL
)
SELECT * FROM T
WHERE T.NM IN ('A', 'C', 'D');
NM 은 조회조건으로 넘어와 변동됩니다.
INTERSECT 로 교집합만 구하려고 하는데,
WITH T AS (
SELECT 1 AS ID, 'A' AS NM FROM DUAL UNION ALL
SELECT 2 AS ID, 'A' AS NM FROM DUAL UNION ALL
SELECT 3 AS ID, 'A' AS NM FROM DUAL UNION ALL
SELECT 1 AS ID, 'B' AS NM FROM DUAL UNION ALL
SELECT 2 AS ID, 'B' AS NM FROM DUAL UNION ALL
SELECT 3 AS ID, 'B' AS NM FROM DUAL UNION ALL
SELECT 1 AS ID, 'C' AS NM FROM DUAL UNION ALL
SELECT 2 AS ID, 'C' AS NM FROM DUAL UNION ALL
SELECT 1 AS ID, 'D' AS NM FROM DUAL
)
SELECT ID FROM T
WHERE T.NM IN ('A', 'C', 'D')
INTERSECT
SELECT ID FROM T
WHERE T.NM = 'A'
INTERSECT
SELECT ID FROM T
WHERE T.NM = 'C'
INTERSECT
SELECT ID FROM T
WHERE T.NM = 'D';
이런식으로 하면 원하는 결과값은 나오지만
조회조건마다
INTERSECT
SELECT ID FROM T
WHERE T.NM = '' 이부분을 계속 추가할수는 없습니다.
다른 방법이 있을련지요..
WITH T AS ( SELECT 1 AS ID, 'A' AS NM FROM DUAL UNION ALL SELECT 2 AS ID, 'A' AS NM FROM DUAL UNION ALL SELECT 3 AS ID, 'A' AS NM FROM DUAL UNION ALL SELECT 1 AS ID, 'B' AS NM FROM DUAL UNION ALL SELECT 2 AS ID, 'B' AS NM FROM DUAL UNION ALL SELECT 3 AS ID, 'B' AS NM FROM DUAL UNION ALL SELECT 1 AS ID, 'C' AS NM FROM DUAL UNION ALL SELECT 2 AS ID, 'C' AS NM FROM DUAL UNION ALL SELECT 1 AS ID, 'D' AS NM FROM DUAL ) SELECT ID , VAL FROM (SELECT ID , LISTAGG(NM,'|') WITHIN GROUP(ORDER BY NM ) VAL FROM T GROUP BY ID ) WHERE VAL LIKE '%A%C%D%' --REGEXP_COUNT 이용 SELECT ID , VAL FROM (SELECT ID , LISTAGG(NM,'|') WITHIN GROUP(ORDER BY NM ) VAL FROM T GROUP BY ID ) WHERE REGEXP_COUNT(VAL,'A|C|D') >= 3 -- 그냥 간단했네요.. SELECT ID FROM T WHERE NM IN ( 'A' ,'C' ,'D' ) GROUP BY ID HAVING COUNT(DISTINCT NM ) >= 3