【问题标题】:Does BigQuery guarantee column order when performing SELECT * query from subselect?BigQuery 在从子选择中执行 SELECT * 查询时是否保证列顺序?
【发布时间】:2020-01-20 14:05:51
【问题描述】:

BigQuery 在执行SELECT * FROM 子查询时是否保证列顺序?
例如,给定表t,列a、b、c、d,如果我要执行查询:

SELECT * EXCEPT (a) FROM (SELECT a, b, c, d FROM t)

结果中的列是否总是具有相同的顺序(在这种情况下为b、c、d)?

【问题讨论】:

  • 是什么让你认为事实并非如此?
  • 我在 BigQuery 文档中没有找到任何可以说明这一点的内容。

标签: sql google-bigquery


【解决方案1】:

我会回答“是”;但是,没有记录这样做。唯一的保证(根据文档)是:

SELECT *,通常称为选择星号,为执行完整查询后可见的每一列生成一个输出列。

这并没有明确说明列是按照它们定义的顺序排列的——即首先按照 FROM 子句中的引用顺序,然后按照每个引用中的顺序排列。我什至不确定 SQL 标准是否指定了排序(尽管我模糊记得 92 标准可能有)。

也就是说,我从未见过 任何 数据库不按指定顺序生成列。另外,数据库(通常)必须保持列的顺序以支持INSERT。您可以在INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION 中亲自查看。而且,如果不能保证排序,REPLACE 功能(用于替换 SELECT 列表中的列表达式)将不太有意义。

假设顺序相同,我可能会争辩说您“非常安全”。我们应该游说谷歌修复文档以明确这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-09
    • 2014-07-22
    • 2014-12-05
    相关资源
    最近更新 更多