【发布时间】:2012-05-09 22:23:55
【问题描述】:
我正在经历规范化一个可怕的遗留数据库的痛苦,并且发现了我认为是 DBMS 的一个错误。
此查询按我的预期返回结果:
SELECT DISTINCT RIGHT(SQUEEZE(thing_id), 2) AS thing_id, TRIM(thing_name)
FROM thing
ORDER BY thing_id, thing_name;
(16 rows)
我第一次运行查询时,无意中在 ORDER BY 中使用了错误的列,如下所示:
SELECT DISTINCT RIGHT(SQUEEZE(thing_id), 2) AS thing_id, TRIM(thing_name)
FROM thing
ORDER BY thing_name, location;
(33 rows)
请注意,唯一要更改的是 ORDER BY,返回的行数从 16 增加到 33。它给出的结果不是查询指定的 DISTINCT。
我认为这是一个彻头彻尾的错误,但一位同事说这是正常的,因为当我们按“位置”订购时,它被选择了一个不可见的包含在结果中。
ORDER BY 是否应该影响 SELECT 查询中返回的行数?
编辑:我让另一个人查看查询并将查询复制到两个单独的文件中,然后对它们运行 diff 命令。 100% 确定这两个查询之间的唯一区别是 ORDER BY 中列出的列。
更新:Ingres 自发布补丁 14301 以来已修复错误:“错误 126640 (GENERIC) 使用 order-by 表达式和不同聚合的查询返回的行数比预期的多。order-by 表达式中的列不在选择列表中。 "
即有问题的查询现在将导致错误,因为结果不正确。
【问题讨论】:
-
你能显示确切的查询吗?
-
@shiplu.mokadd.im 以上是确切的查询。我只是用“thing”替换了真实的公司名称,并删除了返回的数据。
-
检查数据库是否损坏。例如,如果两个查询使用两个不同的索引并且其中一个已损坏,您将看到这种行为。
-
或者,您可以尝试删除并重新创建表上的所有索引,或者制作表的副本并重试查询以排除损坏的原因。