7

以下两条 SQL 语句是否总是产生相同的结果集?

 1. SELECT * FROM MyTable where Status='0' order by StartTime asc limit 10

 2. SELECT * FROM (SELECT * FROM MyTable where Status='0' order by StartTime asc) limit 10
4

2 回答 2

7

是的,但是订购子查询可能是一个不好的习惯。在第二个示例中,您可以在子查询之外进一步添加一个可行的方法ORDER BY,例如

SELECT * 
FROM (SELECT * 
      FROM Test
      ORDER BY ID ASC
     ) AS A
ORDER BY ID DESC
LIMIT 10;

SQLite 仍然ORDER BY在内部查询上执行,然后在外部查询中再次对它们进行排序。不必要的资源浪费。

我已经做了一个SQL Fiddle来演示,这样您就可以查看每个的执行计划。

于 2012-05-03T10:53:02.420 回答
7

没有。首先是因为该StartTime列可能没有UNIQUE约束。因此,即使是第一个查询也可能并不总是产生相同的结果——它本身!

其次,即使没有两行具有相同的 StartTime,答案仍然是否定的。

第一条语句将始终按顺序排列StartTime并生成前 10 行。第二个查询可能会产生相同的结果集,但仅使用不了解ORDER BY子查询中的 冗余的原始优化器。并且仅当执行计划包含此排序阶段时。

SQLite 查询优化器(目前)可能不是很聪明,只能做到这一点(真的不知道,我们必须检查 SQLite* 的源代码)。因此,这两个查询似乎一直在产生相同的结果。不过,指望它并不是一个好主意。你永远不知道 SQLite 的未来版本会发生什么变化。

我认为在任何 DBMS 中LIMIT不使用 , 都不是一个好习惯。ORDER BY它现在可能工作,但您永远不知道应用程序将使用这些查询多长时间。升级 SQLite 或更改 DBMS 时,您可能不在身边。

(*) @Gareth 的链接提供了执行计划,表明当前的 SQLite 代码足够愚蠢,可以执行冗余排序。

于 2012-05-03T10:53:26.320 回答