【发布时间】:2020-01-30 18:11:54
【问题描述】:
我很好奇我看到一个“朋友”写的查询 (LOL),对此我感到很惊讶。这是简化的案例:
create table my_table (
a int,
b int,
c int,
d int,
primary key (a, b, c)
);
insert into my_table (a, b, c, d) values (1, 2, 3, 4);
insert into my_table (a, b, c, d) values (5, 6, 7, 8);
select *, count(*), sum(d)
from my_table
group by 1, 2, 3
这实际上在 PostgreSQL 中有效,并在最后一行将 1, 2, 3 转换为 a, b, c,而从不转换为 c, b, a 或其他。
结果(PostgreSQL 11.1):
a b c d count sum
- - - - ----- ---
5 6 7 8 1 8
1 2 3 4 1 4
那么,* 实际上保留列顺序吗?
我可能永远不会写出这样令人困惑的查询,但我仍然想知道 SQL 标准是否对此有任何规定。
【问题讨论】:
-
这在 Postgres 中不起作用 -- 我想你会知道 -- dbfiddle.uk/….
-
2 件事:1,这个错误。 2,我相信
*只是扩展到基于序数的列。所以我认为它会保持秩序。 -
@GordonLinoff:如果列包含主键,它会起作用:dbfiddle.uk/…
-
添加了主键定义,现在它可以在任何地方使用。
-
@GSerg 完美。 “...列在 T... 中的序号位置的升序引用”。这清楚地回答了它。请标记为重复关闭。