加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 18:53:17 所属栏目:百科 来源:网络整理
导读:我只是想知道是否有人遇到SQLite(3.7.4)中的一个案例,其中一个查询将返回一组结果,当它成为子查询时,结果完全不同?我在更复杂的查询中发现了问题,但这是一个更简单的示例,演示了相同的行为: 数据库设置: CREATE TABLE "test" ("letter" VARCHAR(1) PRIMAR
我只是想知道是否有人遇到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;

这将返回一个| 2,结果中的第二行正如您所期望的那样,因为我们正在对字母进行排序,然后是数字.但是,这是我没想到的:

初始查询作为子查询:

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

这返回1,这完全不是我的预期.我期望看到的是2.我对子查询如何工作的理解是它应该返回相同的结果,就像内部查询被实现一样,并且外部查询被应用于那些结果(即使我意识到数据库变得极端长度不得在必要时实现结果).

我的假设不正确吗?我在PostgreSQL和MySQL中测试了相同的查询,它按预期工作(即返回2).对我来说,我看到的是SQLite崩溃子查询的错误,但我不确定.

重申一下,上面的例子简化了我实际做的事情.我不只是在返回单行的子查询上使用DISTINCT,而是返回许多行,其中一些行具有相同的值,因此我需要DISTINCT.以上示例是我能想到的最简单的方法来演示正在发生的事情.

编辑:我能够通过向内部查询添加OFFSET 0来禁用不正确的子查询折叠,例如

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

我将通过SQLite邮件列表将此报告为错误,这是一种解决方法.

解决方法

我可以验证它也适用于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") AS "test";

它回来了

1
2
(2 rows)

有趣的是,这也会返回正确的结果

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

可以使用EXPLAIN比较这两个计划.DESCRIBE正在添加大量操作,内嵌和优化内部查询(错误地).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读