열 수가 다른 두 테이블 결합


106

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

열 수가 다릅니다. 테이블 A에 더 많은 열이 있다고 가정합니다.

이 두 테이블을 통합하고 테이블 B에없는 열에 대해 null을 얻으려면 어떻게해야합니까?

답변:


215

다음과 같은 열이 적은 테이블에 대해 추가 열을 null로 추가하십시오.

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

6
Null 열의 기본값을 채우는 방법이 있습니까?
Hans

3
@Hans : isnull (ColumnName, 0) as ColumnName 또는 isnull (ColumnName, '-') as ColumnName 또는 이와 유사한 것을 할 수 있습니다.
Kangkan 2014

3
이 솔루션은 모든 열을 나열하지 않고도 작동한다는 것을 깨달았습니다. 그래서 대신에 Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2, 하나는 또한 할 수있다 Select *, Null as Col4, Null as Col5 from Table2.
Pratik Patel

null 값의 경우이 해킹이 나를 위해 일했습니다 .'SomeString 'as DummyColumn. 기본적으로 NULL을 일부 값으로 바꿉니다. 이것은 groupby와 함께 사용할 때도 작동했습니다.
Saurabh Jain

8

나는 여기에 와서 위의 대답을 따랐습니다. 그러나 데이터 유형의 순서가 일치하지 않으면 오류가 발생했습니다. 다른 답변의 아래 설명이 유용합니다.

위의 결과가 표의 열 순서와 동일합니까? 오라클은 열 순서가 엄격하기 때문입니다. 아래 예제는 오류를 생성합니다.

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 : 표현식은 해당 표현식과 동일한 데이터 유형을 가져야합니다

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

test1_1790 union에서 col_a, col_b, col_c를 선택하십시오. 모두 test2_1790에서 col_a, col_b, col_c를 선택하십시오. 이 오류에 대한 더 빈번한 시나리오는 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

나는 똑같은 것을 사용해야했지만 null이 아닌 열에 a.col_name과 b.col_name을 추가했습니다. null 열의 경우 다음을 사용해야했습니다. NULL AS col_name1, NULL AS col_name2 등
Scott R

1
note SELECT * UNION은 여러 번 연결할 수 있습니다. note 모든 SELECT 절에서 WHERE 필터를 사용할 수 있음
mirekphd

1

일반적으로 집합 기반 연산자를 사용할 때 동일한 수의 열이 필요하므로 Kangkan의 대답 이 정확합니다.

SAS SQL에는 해당 시나리오를 처리하는 특정 연산자가 있습니다.

SAS (R) 9.3 SQL 프로 시저 사용 설명서

CORRESPONDING (CORR) 키워드

CORRESPONDING 키워드는 집합 연산자가 지정된 경우에만 사용됩니다. 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의 출력 스키마에는 일치하는 열과 양쪽의 일치하지 않는 열이 모두 포함됩니다. 이것은 한쪽에서 오는 각 행에 다른쪽에 만있는 "누락 된 열"이있는 상황을 만듭니다. 이러한 열의 경우 "누락 된 셀"에 대한 기본값이 제공됩니다. 기본값은 nullable 형식의 경우 null이고 nullable이 아닌 형식의 경우 .Net 기본값 (예 : int의 경우 0)입니다.

이름으로

OUTER와 함께 사용할 때 필요합니다. 이 절은 Union이 위치가 아니라 열 이름을 기준으로 값을 일치시키고 있음을 나타냅니다. BY NAME 절이 지정되지 않은 경우 일치가 위치 적으로 수행됩니다.

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

그리고 코드 :

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

편집하다:

외부 결합의 개념은 KQL에서 지원합니다 .

종류:

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

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

예:

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 |
+------+------+------+

데모


SQL에서 이것을 달성하는 방법에 대한 아이디어가 있습니까 ??
KetanVaghasiya

@KetanVaghasiya 내가 아는 한 SAS SQL과 U-SQL만이이 개념을 지원합니다.
Lukasz Szozda

-1

행이 1 개만 있으면 조인을 사용할 수 있습니다.

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

두 개의 1 행 테이블 (각각 하나의 튜플이있는 두 개의 다중 집합 관계)의 합집합은 결과 관계에 두 개의 행 (튜플)을 갖습니다. 관계형 대수 (SQL이 아님) 에서는 두 입력 관계에 동일한 튜플이 포함 된 경우에만 통합 결과 하나의 행 있습니다. 1- 튜플 관계의 자기 결합.
Robert Monfera
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.