답변:
다음과 같은 열이 적은 테이블에 대해 추가 열을 null로 추가하십시오.
Select Col1, Col2, Col3, Col4, Col5 from Table1
Union
Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2
Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2
, 하나는 또한 할 수있다 Select *, 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 : 표현식은 해당 표현식과 동일한 데이터 유형을 가져야합니다
보시다시피 오류의 근본 원인은 *를 열 목록 지정자로 사용함으로써 암시되는 일치하지 않는 열 순서에 있습니다. 이러한 유형의 오류는 열 목록을 명시 적으로 입력하여 쉽게 피할 수 있습니다.
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
일반적으로 집합 기반 연산자를 사용할 때 동일한 수의 열이 필요하므로 Kangkan의 대답 이 정확합니다.
SAS 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은 유사한 개념을 지원합니다.
밖의
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 |
+------+------+------+
행이 1 개만 있으면 조인을 사용할 수 있습니다.
Select t1.Col1, t1.Col2, t1.Col3, t2.Col4, t2.Col5 from Table1 t1 join Table2 t2;