source

열 수가 다른 두 표를 결합합니다.

nicesource 2022. 12. 24. 17:23
반응형

열 수가 다른 두 표를 결합합니다.

2개의 테이블(표 A와 표 B)이 있습니다.

각 열의 수가 다릅니다. 표 A에 열이 더 있다고 가정해 보십시오.

어떻게 하면 이 두 개의 테이블을 통합하고 테이블 B에 없는 컬럼에 대해 null을 얻을 수 있을까요?

다음과 같은 열이 적은 테이블에 대해 null로 추가 열을 추가합니다.

Select Col1, Col2, Col3, Col4, Col5 from Table1
Union
Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2

나는 여기 와서 위의 대답을 따랐다.그러나 데이터 유형 순서 불일치로 인해 오류가 발생했습니다.다른 답변의 아래 설명이 도움이 될 것입니다.

위의 결과가 표의 열 순서와 같습니까?오라클은 열 순서가 엄격하기 때문입니다.다음 예에서는 오류가 발생합니다.

create table test1_1790 (
col_a varchar2(30),
col_b number,
col_c date);

create table test2_1790 (
col_a varchar2(30),
col_c date,
col_b number);

select * from test1_1790
union all
select * from test2_1790;

ORA-01790: 식은 대응하는 식과 데이터 형식이 같아야 합니다.

보시다시피 오류의 근본 원인은 *를 열 목록 지정자로 사용하여 암시되는 불일치 열 순서 지정에 있습니다.이러한 유형의 오류는 열 목록을 명시적으로 입력하면 쉽게 방지할 수 있습니다.

select col_a, col_b, col_c from test1_1790 union all select col_a, col_b, col_c from test2_1790. 이 오류의 보다 빈번한 시나리오는 SELECT 목록의 두 개 이상의 열을 실수로 스왑(또는 이동)하는 경우입니다.

select col_a, col_b, col_c from test1_1790
union all
select col_a, col_c, col_b from test2_1790;

또는 위의 방법으로 문제가 해결되지 않는 경우 다음과 같이 컬럼에 ALIAS를 작성하는 것이 좋습니다(쿼리는 고객님의 것과 동일하지 않지만 여기서 중요한 것은 컬럼에 에일리어스를 추가하는 방법입니다).

SELECT id_table_a, 
       desc_table_a, 
       table_b.id_user as iUserID, 
       table_c.field as iField
UNION
SELECT id_table_a, 
       desc_table_a, 
       table_c.id_user as iUserID, 
       table_c.field as iField

일반적으로 집합 기반 연산자를 사용할 때는 열의 수가 같아야 하므로 Kangkan의은 정확합니다.

SAS SQL에는 이러한 시나리오를 처리하기 위한 특정 연산자가 있습니다.

SAS(R) 9.3 SQL 프로시저 사용자 가이드

CORRING (CORR) 키워드

CONPORGING 키워드는 set 연산자가 지정된 경우에만 사용됩니다.CORR에 의해 PROC SQL은 테이블 표현식의 컬럼을 서수 위치가 아닌 이름으로 일치시킵니다.OUTER UNION 연산자를 제외하고 이름으로 일치하지 않는 열은 결과 테이블에서 제외됩니다.

SELECT * FROM tabA
OUTER UNION CORR
SELECT * FROM tabB;

대상:

+---+---+
| a | b |
+---+---+
| 1 | X |
| 2 | Y |
+---+---+

OUTER UNION CORR

+---+---+
| b | d |
+---+---+
| U | 1 |
+---+---+

<=>

+----+----+---+
| a  | b  | d |
+----+----+---+
|  1 | X  |   |
|  2 | Y  |   |
|    | U  | 1 |
+----+----+---+

U-SQL은 유사한 개념을 지원합니다.

이름별 외부 유니온 ON(*)

외부

에는 BY NAME 절과 ON 목록이 필요합니다.다른 집합 식과 달리 OUTER UNION의 출력 스키마에는 양쪽에서 일치하는 열과 일치하지 않는 열이 모두 포함됩니다.이로 인해 한 변에서 오는 각 행에 다른 변에만 있는 "결측 열"이 있는 상황이 발생합니다.이러한 열의 경우 "누락 셀"에 대한 기본값이 제공됩니다.null 유형 및 의 기본값은 null입니다.Null 불가능한 유형의 순 기본값(예를 들어 int의 경우 0).

이름별

는 OUTER와 함께 사용할 때 필요합니다.이 절은 결합이 위치가 아닌 열 이름으로 값을 일치시키고 있음을 나타냅니다.BY NAME 절을 지정하지 않으면 매칭이 위치별로 수행됩니다.

ON 구에 "*" 기호가 포함되어 있는 경우(목록의 마지막 멤버 또는 유일한 멤버로 지정할 수 있음), ON 구에 있는 이름 이외의 추가 일치가 허용되며 결과 열에는 왼쪽 인수에 있는 순서대로 일치하는 모든 열이 포함됩니다.

코드:

@result =    
    SELECT * FROM @left
    OUTER UNION BY NAME ON (*) 
    SELECT * FROM @right;

편집:

외부 유니언의 개념은 KQL에서 지원됩니다.

종류:

inner - 결과에는 모든 입력 테이블에 공통되는 열의 하위 집합이 있습니다.

외부 - 결과에는 모든 입력에서 발생하는 모든 열이 포함됩니다.입력 행에서 정의되지 않은 셀은 null로 설정됩니다.

예:

let t1 = datatable(col1:long, col2:string)  
[1, "a",  
2, "b",
3, "c"];
let t2 = datatable(col3:long)
[1,3];
t1 | union kind=outer t2;

출력:

+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
|    1 | a    |      |
|    2 | b    |      |
|    3 | c    |      |
|      |      |    1 |
|      |      |    3 |
+------+------+------+

데모

행이 1개뿐인 경우 join을 사용할 수 있습니다.

Select t1.Col1, t1.Col2, t1.Col3, t2.Col4, t2.Col5 from Table1 t1 join Table2 t2;

언급URL : https://stackoverflow.com/questions/2309943/unioning-two-tables-with-different-number-of-columns

반응형