더북(TheBook)

① 집합 연산자로 연결되는 각 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 타입이므로 오류가 발생한 것을 확인할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.