Oracle SQL 강좌
Multiple-Column Subquery 9 24 99,999+

by 구루비 다중 열 서브쿼리 PAIRWISE NONPAIRWISE Multiple-Column Subquery 서브쿼리 Subquery [2002.08.30]


Multiple-Column Subquery란?

결과 값이 두 개 이상의 컬럼을 반환하는 Subquery이다

Pairwise(쌍비교) Subquery

Subquery가 한 번 실행되면서 두 개 이상의 컬럼을 검색해서 주 쿼리로 넘겨 준다.

 
SELECT empno, sal, deptno
  FROM emp
 WHERE (sal, deptno) IN (SELECT sal, deptno
                          FROM emp
                         WHERE deptno = 30
                           AND comm is NOT NULL);

     EMPNO        SAL     DEPTNO
---------- ---------- ----------
      7521       1250         30
      7654       1250         30
      7844       1500         30
      7499       1600         30 

Nonpairwise(비쌍비교) Subquery

WHERE 절에서 두 개 이상의 서로 다른 Subquery가 사용되어서 결과 값을 주 쿼리로 넘겨 준다.

 
SELECT empno, sal, deptno
  FROM emp
 WHERE sal IN (SELECT sal
                 FROM emp
                WHERE deptno = 30
                  AND comm is NOT NULL);
  AND deptno IN (SELECT deptno
                   FROM emp
                  WHERE deptno = 30
                    AND comm is NOT NULL); 

     EMPNO        SAL     DEPTNO
---------- ---------- ----------
      7521       1250         30
      7654       1250         30
      7844       1500         30
      7499       1600         30 

Null Values in a Subquery

서브쿼리에서 NULL 값이 반환 되면 주 쿼리 에서는 어떠한 행도 반환되지 않는다.

- 강좌 URL : http://www.gurubee.net/lecture/1504

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 혀너 [2004.09.03 16:08:18]
위 두 비교 쿼리의 결과 값이 같은 건가요?
실행 보니깐. 틀린거 같아요..
차이점좀 확실히 설명해 주세용!! ^^;

by 나그네 [2004.09.11 12:36:57]
두 쿼리의 실행결과는 같습니다.

by 마농 [2004.11.30 11:18:02]
교집합과 합집합의 차이..
잘 한번 생각해 보세요~

by 젠트 [2005.05.11 22:08:41]
Pairwise(쌍비교) Subquery 와 Nonpairwise(비쌍비교) Subquery 의 차이점은
Pairwise 는 sal 과 deptno 가 같을때만 출력되고 Nonwarwise 는 둘중 하나만 같아도 출력되는 것으로 알고있음.. 확실히는 모르겠네요;;

by smile [2005.11.09 20:26:35]
퍼갑니다. ^^

by 시근땀 [2006.03.20 14:10:25]
비쌍비교에서 AND 가 사용된 것을 보아 sal과 deptno가 동시에 일치해야 출력될 것 같은데요. 그니까 쌍비교랑 결과값이 같을 것 같은데....

by 지니 [2007.01.19 10:53:02]
위의 두 비교 쿼리는 같고, Nonwarwise 에서 and 대신 or 를 써야 Nonwarwise 를 쓴 이유가 될 것 같네요

by 11lee [2007.03.23 14:14:39]
경우에 따라 결과값이 다를수도 있을꺼 같다는 생각이 듭니다. 서브쿼리의 WHERE 절 다음의 조건문이 달라지면 비쌍비교 에서 더 많으느 ROW가 반환되지 않을까요???

by Death [2007.10.08 17:43:55]
음...조건에 deptno = 30 AND comm is NOT NULL
이렇게 되어 있어서 같게 나왔지만,

deptno = 30,
comm is NOT NULL
이 두 개의 조건을 따로 썼을 경우 결과가 다를 수 있습니다

by bandalusk [2008.09.25 23:40:32]
※정리※
Pairwise(쌍비교) Subquery : 교집합
Nonpairwise(비쌍비교) Subquery : 합집합

by 손님 [2008.09.28 19:55:31]
//젠트

젠트님에 말씀에 약간 궁금(?) 의문이 생깁니다.
Nonwarwise는 둘 중 하나만 같아도 출력되는것 이라고 하셨는데

둘 중 하나만 같아도 출력된다라는 이말은 'OR' 란 말이지 않나요?

by 손님 [2008.09.28 20:00:29]
테이블 A
COL1 COL2
A 10
A 20
B 10
B 20

....WHERE (COL1, COL2) IN ( ... WHERE COL1 = 'A' AND COL2 = '20')
여기서는 당연히
COL1 COL2
A 20
이 출력 되겠죠?

....WHERE COL1 IN (... WHERE COL1 = 'A')
AND COL2 IN (...WHERE COL2 = '20')

여기서는 어떤 값이 출력 될까요?
제 생각에는
A - 10, A -20, B-10, B-20
이런식으로 쌍이 맺어져서 결과값을 출력하는게 아닐까요?
만약 그렇다면 테이블에 모든 값이 출력되는 걸로 되는데..

제 생각이 잘못되었다면 지적좀 해주세요~

P.S 직접 해보고 싶었는데 상황이 마땅치 않네요

by 리스브 [2009.04.07 14:21:49]
마지막 손님글을 응용하여 차이나도록 만들어 봤습니다.
SELECT III, COL1, COL2
FROM ( SELECT 0 AS III, 'A' AS COL1, 10 AS COL2 FROM DUAL
UNION ALL
SELECT 1 AS III, 'A' AS COL1, 20 AS COL2 FROM DUAL
UNION ALL
SELECT 2 AS III, 'B' AS COL1, 10 AS COL2 FROM DUAL
UNION ALL
SELECT 3 AS III, 'A' AS COL1, 20 AS COL2 FROM DUAL )
WHERE ( COL1, COL2 ) IN ( SELECT COL1, COL2
FROM ( SELECT 0 AS III, 'A' AS COL1, 10 AS COL2 FROM DUAL
UNION ALL
SELECT 1 AS III, 'A' AS COL1, 20 AS COL2 FROM DUAL
UNION ALL
SELECT 2 AS III, 'B' AS COL1, 10 AS COL2 FROM DUAL
UNION ALL
SELECT 3 AS III, 'A' AS COL1, 20 AS COL2 FROM DUAL )
WHERE III >= 2
)
III COL1 COL2
------------------------------
1 A 20
2 B 10
3 A 20

SELECT III, COL1, COL2
FROM ( SELECT 0 AS III, 'A' AS COL1, 10 AS COL2 FROM DUAL
UNION ALL
SELECT 1 AS III, 'A' AS COL1, 20 AS COL2 FROM DUAL
UNION ALL
SELECT 2 AS III, 'B' AS COL1, 10 AS COL2 FROM DUAL
UNION ALL
SELECT 3 AS III, 'A' AS COL1, 20 AS COL2 FROM DUAL )
WHERE COL1 IN ( SELECT COL1
FROM ( SELECT 0 AS III, 'A' AS COL1, 10 AS COL2 FROM DUAL
UNION ALL
SELECT 1 AS III, 'A' AS COL1, 20 AS COL2 FROM DUAL
UNION ALL
SELECT 2 AS III, 'B' AS COL1, 10 AS COL2 FROM DUAL
UNION ALL
SELECT 3 AS III, 'A' AS COL1, 20 AS COL2 FROM DUAL )
WHERE III >= 2
)
AND COL2 IN ( SELECT COL2
FROM ( SELECT 0 AS III, 'A' AS COL1, 10 AS COL2 FROM DUAL
UNION ALL
SELECT 1 AS III, 'A' AS COL1, 20 AS COL2 FROM DUAL
UNION ALL
SELECT 2 AS III, 'B' AS COL1, 10 AS COL2 FROM DUAL
UNION ALL
SELECT 3 AS III, 'A' AS COL1, 20 AS COL2 FROM DUAL )
WHERE III >= 2
)
III COL1 COL2
------------------------------
0 A 10
1 A 20
2 B 10
3 A 20

두개의 차이는 한건이 아닌 여러건 조회에서
중복된 데이터가 있는 경우에서의 차이가 있네요.

by 경재 [2009.09.16 13:25:20]
같은조건 검색시 1번이 2번보다 쿼리를 덜 사용.
다른조건 검색시2번을 사용

by 양한마리 [2010.02.03 10:49:32]
쉽고 간결하네요 ^ ^

by 손님 [2012.10.02 17:44:03]
감사합니다

by 까망소 [2012.12.21 18:13:26]

Pairwise(쌍비교) Subquery 와 Nonpairwise(비쌍비교) Subquery 에서의 결과는
동일한 것이 맞는거죠?
공식답변을 바라요~ ^^*

by 손님 [2013.04.04 14:45:37]
헐 이런 것도 되네요.

by 손님 [2013.04.19 14:10:44]
와 좋다. 그런데 where 절에서만 사용이 가능한건가요/

by 정존 [2013.07.12 13:18:10]
좋은 자료 감사합니다.^^

by 박군 [2013.12.31 16:05:35]

제 짧은 이해력으로 질문드리면

고수님들께서 왜 교집합과 합집합에 대한 이야기가 나오는지 잘 모르겠네요

쌍비교는 서브쿼리에서 2개이상의 컬럼을 리턴받아 2개의 행 즉 쌍으로 비교하여 둘다 만족해야 출력될것이고

비쌍비교는 2개이상의 서브쿼리로 단일컬럼을 리턴받아 컬럼 and 컬럼 and 컬럼... 으로

결국에 여러 조건(컬럼and컬럼and...)를 다 만족해야만 해당 행들을 출력시키니

굳이 이야기하자면 둘다 교집합이라고 이야기 해야 맞을 것 같은데요

경재님의 답변이 사용설명이  맞는 것 같구요

경재 [2009년 09월 16일 13시]

같은조건 검색시 1번이 2번보다 쿼리를 덜 사용.
다른조건 검색시2번을 사용


틀린부분이 있다면 리플달아주시면 감사하겠습니다.


by 마농 [2013.12.31 16:21:16]

1번과 2번쿼리는 같은 쿼리가 아닙니다. 다른 쿼리입니다.

예를 들어 서브쿼리의 결과가 (1, a) (2, b) 이렇게 2건이 나올 경우
1번 쿼리의 결과는 (1, a) (2, b) 가 나오구요.
2번 쿼리의 결과는 (1, a) (1, b) (2, a) (2, b) 가 나옵니다.
즉 원치 않는 결과 (1, b) (2, a) 가 포함되어 나오게 되는거구요.
1번의 의도를 가지고 2번처럼 작성하는 실수를 하시면 안되겠지요.

즉, 1번과 2번의 차이를 성능 관점에서 바라보는 것은 전혀 의미 없는 짓입니다.
성능 비교는 같은 결과를 내는 쿼리끼리 비교하는 거죠.
1, 2 번 쿼리는 그 논리적인 의미를 비교해야 합니다.


by 주정래 [2014.11.14 13:22:07]

마농님이 정답인듯.. 다른 결과가 나올거 같은데요


by sophistor [2019.03.08 17:19:24]

엄밀히 말하면 2번째는

mult-column subquery가 아니지 않나요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입