我正在经历规范化一个可怕的遗留数据库的痛苦,并且发现了我认为是 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 表达式和 distinct 聚合的查询返回的行数比预期的多。order-by 表达式中的列不在选择列表中。”
即有问题的查询现在将导致错误,因为结果不正确。