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

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