Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite外部查询正在返回内部查询中找不到的结果_Sql_Sqlite_Subquery_Distinct - Fatal编程技术网

SQLite外部查询正在返回内部查询中找不到的结果

SQLite外部查询正在返回内部查询中找不到的结果,sql,sqlite,subquery,distinct,Sql,Sqlite,Subquery,Distinct,我只是想知道是否有人在SQLite(3.7.4)中遇到过这样的情况:一个查询将返回一组结果,而当它成为一个子查询时,结果会完全不同?我在一个更复杂的查询中发现了这个问题,但这里有一个简单的示例演示了相同的行为: 数据库设置: CREATE TABLE "test" ("letter" VARCHAR(1) PRIMARY KEY, "number" INTEGER NOT NULL); INSERT INTO "test" ("letter", "number") VALUES('b', 1)

我只是想知道是否有人在SQLite(3.7.4)中遇到过这样的情况:一个查询将返回一组结果,而当它成为一个子查询时,结果会完全不同?我在一个更复杂的查询中发现了这个问题,但这里有一个简单的示例演示了相同的行为:

数据库设置:

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;
SELECT DISTINCT "number" FROM (SELECT "letter", "number" FROM "test" ORDER BY "letter", "number" LIMIT 1) AS "test";
初始查询:

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;
SELECT DISTINCT "number" FROM (SELECT "letter", "number" FROM "test" ORDER BY "letter", "number" LIMIT 1) AS "test";
这将返回
a | 2
,这是结果中的第二行,正如您所期望的那样,因为我们先按字母排序,然后按数字排序。然而,以下是我没有想到的:

作为子查询的初始查询:

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;
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邮件列表报告这是一个bug,这是一个解决方法。

我可以验证SQLite Firefox插件是否也会发生这种情况

如果有什么安慰的话,这个表格可以:

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";
它回来了

1
2
(2 rows)
有趣的是,这也会返回正确的结果

SELECT number FROM (SELECT letter, number FROM test
ORDER BY letter, number LIMIT 1) AS test;
这两个计划可以使用EXPLAIN进行比较。

descripe正在添加大量操作,用于排列和优化内部查询(错误)。

感谢您的确认。现在我有了它,我将通过适当的渠道报告这是一个bug。