① 집합 연산자로 연결되는 각 SELECT문의 SELECT 리스트의 개수와 데이터
타입은 일치해야 한다
입력
SELECT goods
FROM exp_goods_asia
WHERE country = '한국'
UNION
SELECT seq, goods
FROM exp_goods_asia
WHERE country = '일본';
결과
SQL 오류: ORA-01789: 질의 블록은 부정확한 수의 결과 열을 가지고 있습니다.
위 쿼리에서는 두 번째 SELECT 문에서 seq 항목을 추가해서 오류가 발생했다. 이런 경우 두 번째 문장에서 이 컬럼을 빼야 한다. 여기서 질문 하나! 두 번째 문장에서 seq를 빼는 대신 첫 번째 문장에서 seq를 추가해도 되지 않을까? 이렇게 하면 오류는 나지 않지만 다음과 같이 결과가 달라진다.
입력
SELECT seq, goods
FROM exp_goods_asia
WHERE country = '한국'
UNION
SELECT seq, goods
FROM exp_goods_asia
WHERE country = '일본';
결과
SEQ GOODS
---------- --------------------------------
1 원유제외 석유류
1 자동차
2 자동차
2 자동차부품
3 전자집적회로
4 선박
5 LCD
5 반도체웨이퍼
6 자동차부품
6 화물차
7 원유제외 석유류
7 휴대전화
8 건설기계
8 환식탄화수소
9 다이오드, 트랜지스터
9 무선송신기 디스플레이 부속품
10 기계류
10 철 또는 비합금강
18개의 행이 선택됨
항목 자체가 seq와 goods, 두 개로 늘어나서 집합 연산 대상도 seq와 goods가 합쳐져 연산을 수행한다. 따라서 중복 건을 제외할 때 goods 뿐만 아니라 seq도 반영되어 총 18건이 조회된 것이다. 제외된 두 건의 중복 데이터는 INTERSECT를 사용해 확인할 수 있다.
입력
SELECT seq, goods
FROM exp_goods_asia
WHERE country = '한국'
INTERSECT
SELECT seq, goods
FROM exp_goods_asia
WHERE country = '일본';
결과
SEQ GOODS
---------- ------------------
3 전자집적회로
4 선박
위 두 건은 한국이나 일본 모두 seq와 goods 컬럼 값이 같은 것이다. 또한 각 SELECT 항목의 데이터 타입도 일치시켜야 한다.
입력
SELECT seq
FROM exp_goods_asia
WHERE country = '한국'
UNION
SELECT goods
FROM exp_goods_asia
WHERE country = '일본';
결과
SQL 오류: ORA-01790: 대응하는 식과 같은 데이터 유형이어야 합니다.
첫 번째 문장의 seq는 NUMBER, 두 번째는 VARCHAR2 타입이므로 오류가 발생한 것을 확인할 수 있다.