쿼리가 한 세트의 결과를 반환하는 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 메일 링리스트를 통해 버그로보고 할 것입니다.
확인해 주셔서 감사합니다. 이제 알았으니 적절한 채널을 통해 버그로보고 할 것입니다. – dkubb