2011-02-02 7 views
4

쿼리가 한 세트의 결과를 반환하는 SQLite (3.7.4)의 사례를 실행 한 적이 있는지 궁금해했습니다. 서브 쿼리가되면 결과는 완전히 다른가요? 나는 더 복잡한 쿼리의 문제를 찾았지만, 여기에 같은 동작을 보여주는 간단한 예입니다 :SQLite 외부 쿼리가 내부 쿼리에서 찾을 수없는 결과를 반환합니다.

데이터베이스 설정 :

CREATE TABLE "test" ("letter" VARCHAR(1) PRIMARY KEY, "number" INTEGER NOT NULL); 

INSERT INTO "test" ("letter", "number") VALUES('b', 1); 
INSERT INTO "test" ("letter", "number") VALUES('a', 2); 
INSERT INTO "test" ("letter", "number") VALUES('c', 2); 

초기 쿼리

SELECT "letter", "number" FROM "test" ORDER BY "letter", "number" LIMIT 1; 

이를 a|2을 반환합니다. 결과에서 두 번째 행은 문자와 숫자를 정렬하는 것으로 예상됩니다. 그러나, 여기에 내가 기대하지 않았다 무엇 : 하위 쿼리로

초기 쿼리 :

SELECT DISTINCT "number" FROM (SELECT "letter", "number" FROM "test" ORDER BY "letter", "number" LIMIT 1) AS "test"; 

1을 반환 전혀 내가 기대했던 것이 아니다. 내가 볼 것으로 예상 한 것은 2입니다. 하위 쿼리 작동 방식에 대한 나의 이해는 내적 쿼리가 구체화 된 것처럼 과 동일한 결과를 반환해야하며, 외부 쿼리는 해당 결과에 대해 적용됩니다 (비록 데이터베이스가 결과를 구체화하지 않는 극한 길이로 이동한다는 것을 알지만 필요한).

내 가정이 올바르지 않습니까? PostgreSQL과 MySQL에서 동일한 쿼리를 테스트했는데 예상대로 작동했습니다 (즉, 2이 반환되었습니다). SQLite가 서브 쿼리를 무너 뜨리는 방법에 대한 버그를 발견했지만 확실하지 않습니다.

위의 예를 반복하면 되겠지만 위의 예는 실제로 실제로 수행 한 것으로 간소화되었습니다. 단일 행을 반환하는 하위 쿼리에 DISTINCT를 사용하는 것이 아니라 여러 행에 대해 동일한 값을 갖는 많은 행을 반환하므로 DISTINCT가 필요합니다. 위의 예는 무엇이 일어나고 있는지를 보여주기 위해 생각할 수있는 가장 간단한 방법입니다.

편집 : OFFSET 0을 내부 쿼리에 추가하여 잘못된 하위 쿼리 접기를 사용 중지 할 수있었습니다 (예 :

SELECT DISTINCT "number" FROM (SELECT "letter", "number" FROM "test" ORDER BY "letter", "number" LIMIT 1 OFFSET 0) AS "test"; 

나는이 문제를 SQLite 메일 링리스트를 통해 버그로보고 할 것입니다.

답변

1

Firefox 용 SQLite 애드온에서도 문제가 없는지 확인할 수 있습니다. 그 어떤 위로 인 경우

,이 형태는 작동합니다

SELECT DISTINCT "number" FROM (SELECT "letter", "number" FROM "test" 
ORDER BY "letter", "number") AS "test" ORDER BY "letter" LIMIT 1; 

내가 SQLite는 사양이 내부 쿼리에서 LIMIT 절을 무시하고 외부를 마이그레이션 생각합니다.제한없이 :

SELECT DISTINCT "number" FROM (SELECT "letter", "number" FROM "test" 
ORDER BY "letter", "number") AS "test"; 

그것은이 또한 올바른 결과

SELECT number FROM (SELECT letter, number FROM test 
ORDER BY letter, number LIMIT 1) AS test; 

Explain을 사용하여 비교 될 수있는 두 가지 계획을 반환 주목

1 
2 
(2 rows) 

재미있는 반환합니다.
DESCRIBE는 내부 쿼리를 인라인하고 최적화하는 작업을 많이 추가하고 있습니다 (잘못).

+0

확인해 주셔서 감사합니다. 이제 알았으니 적절한 채널을 통해 버그로보고 할 것입니다. – dkubb

관련 문제