2012-07-28 3 views
10

나는 오류를 반환하기를 기대하고있는 sqlite 쿼리가 실제로 성공하고 있으며이 쿼리가 유효한 이유를 누군가가 지적 할 수 있는지 궁금해했습니다. .union 모두 다른 수의 열을 가진 쿼리

CREATE TABLE test_table(
    k INTEGER, 
    v INTEGER 
); 

INSERT INTO test_table(k, v) VALUES(4, 5); 

SELECT * FROM(
    SELECT * FROM(
    SELECT k, v FROM test_table WHERE 1 = 0 
) 
    UNION ALL 
    SELECT * FROM(
    SELECT rowid, k, v FROM test_table 
) 
) 

sqlfiddle of above

내가 열 수가 다른 두 개의 선택을 unioning하는 오류를 반환 것이라고 생각합니다. 가장 바깥 쪽 SELECT *을 제거하면 예상 오류가 발생합니다 : SELECTs to the left and right of UNION ALL do not have the same number of result columns.

+0

SQLite는의 특질처럼 보이는! – Andomar

+0

이상한 - 그것이 무엇을 반환합니까? 누락 된 열에 NULL이 있습니까? –

+0

오우 데모를 확인한 결과 열이 생략되었습니다. –

답변

10

대답은 간단합니다. 예, 이것은 버킷입니다. 간단한 예를 들어 설명해 드리겠습니다. 그러나 사전에,의는 documentation를 참조하자

두 개 이상의 단순 SELECT 문이 화합물은 UNION을 사용하여 SELECT 를 형성하기 위해 함께 연결할 수 있습니다, UNION ALL, INTERSECT 또는 연산자를 제외하고. 복합 SELECT에서 모든 구성 SELECT는 과 동일한 수의 결과 열을 반환해야합니다.

문서에 따르면 두 개의 SELECTs은 동일한 수의 열을 제공해야한다는 것을 분명히 말합니다. 그러나, 당신이 말한대로, 가장 바깥 쪽 SELECT는이 '제한'을 이상하게 피합니다.

예 1

SELECT * FROM(
    SELECT k, v FROM test_table 
    UNION ALL 
    SELECT k, v,rowid FROM test_table 
); 

결과 : 코멘트에 지적

k|v 
4|5 
4|5 

번째 열 rowid 단순히 생략 얻는다.

우리는 두 선택 문장의 순서를 전환하는 2

예.

SELECT * FROM(
    SELECT k, v, rowid FROM test_table 
    UNION ALL 
    SELECT k, v FROM test_table 
); 

결과

이제
k|v|rowid 
4|5|1 
4|5| 

, 열을 생략하지만 null 값을 추가하지 않습니다 sqlite가. 이 하위 쿼리로 처리되는 경우

결론

이 내 결론 날을 제공, 그 SQLite는 단순히 UNION ALL 다르게 처리합니다.

PS : 방금 UNION을 사용하는 경우 어떤 시나리오에서든 실패합니다.

7

UNION ALL은 추가 열에 null 값이있는 결과를 반환합니다.

ALL이없는 UNION에 두 테이블의 열 수가 같아야 기본 UNION이 실패합니다.그래서

:

SELECT column1, column2 FROM table a 
UNION ALL 
SELECT column1, column2, column3 FROM table b 

반환 3 열 3

에 널 (null)와 열과 :

SELECT column1, column2 FROM table a 
UNION 
SELECT column1, column2, column3 FROM table b 

열 수가 일치하지 않기 때문에 실패한다.

결론적으로 UNION에 빈 열을 추가하여 각 테이블에서 3 열을 선택하더라도 여전히 작동 할 수 있습니다.

EX :

SELECT column1, column2, '' AS column3 FROM table a 
UNION 
SELECT column1, column2, column3 FROM table b 
+0

좋은 접근! –