【问题标题】:Does "*" ensure a specific column ordering? [duplicate]“*”是否确保特定的列排序? [复制]
【发布时间】: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... 中的序号位置的升序引用”。这清楚地回答了它。请标记为重复关闭。

标签: sql database


【解决方案1】:

我将忽略您的示例代码并解决问题:

* 是否真的保留了列顺序?

一般来说,我没有找到可以保证保留列顺序的特定文档或参考资料。如果有人在标准甚至特定数据库中提供这样的参考,我将非常高兴。

但是,我认为可以安全地假设顺序被保留。以下是三个原因。

首先是我所使用过的所有数据库都始终保留顺序。更重要的是,对于多个表,排序是在FROM 子句中指定的顺序。

第二个是顺序是已知的——至少在提供元数据模式的数据库中是这样。 INFORMATION_SCHEMA.COLUMNS.ORDINAL_NUMBER 列有此信息。

最后,以下工作,我认为可以保证在任何数据库中工作:

insert into t
    select *
    from t;

为了使其工作,列需要按指定的顺序排列。我不认为SELECTINSERT . . . SELECT 中的行为与其自身(除了行的顺序)不同。

【讨论】:

  • I would be very happy if someone produced such a reference - stackoverflow.com/a/11737363/11683?
  • ISO/IEC 9075-2:2016(E), 7.16 , 4)B, "否则,"
猜你喜欢
  • 2016-02-05
  • 1970-01-01
  • 2018-01-04
  • 2011-03-04
  • 2021-04-21
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
相关资源
最近更新 更多