【问题标题】:BigQuery SQL: do SELECT aliases have priority over FROM clause column names when used in GROUP BY clause?BigQuery SQL:在 GROUP BY 子句中使用时,SELECT 别名是否优先于 FROM 子句列名?
【发布时间】:2020-02-01 11:19:47
【问题描述】:

我有一个关于col 的简单查询:

SELECT SUBSTR(col, 1, 4) AS col, 
       COUNT(*) AS nc
  FROM (SELECT 'test1' AS col
         UNION ALL
        SELECT 'test2' AS col) 
 GROUP BY col

根据documentation,查询验证器应该引发错误:

FROM 子句列名和 GROUP BY 中的 SELECT 列表别名之间的歧义:

SELECT UPPER(LastName) AS LastName
FROM Singers
GROUP BY LastName;

上面的查询不明确,会产生错误,因为 GROUP BY 子句中的 LastName 可能引用了 Singers 中的原始列 LastName,也可能引用了别名 AS LastName,其值为 UPPER(LastName)。

但查询成功执行并提供以下结果:

╔═══╦═══════╦══════╗
║   ║ col   ║ nc   ║
╠═══╬═══════╬══════╣
║ 1 ║ test  ║ 2    ║
╚═══╩═══════╩══════╝

从结果中可以清楚地看出,GROUP BY 子句将col 识别为外部选择(整个SUBSTR 表达式)的别名。

所以这是我的问题,它的行为是否足够可靠?我可以在编写查询时考虑到这一点并相应地调整我的查询吗?

【问题讨论】:

  • 。 .我怀疑这些文档可能已经过时了。这种类型的范围问题通常由层次结构解决。显然在这种情况下没有指定的层次结构(因为group by 中的别名不是标准的)。但是,先查看select 然后查看表格是有意义的。
  • 另外,请考虑使用GROUP BY 1 以避免歧义。

标签: sql google-bigquery


【解决方案1】:

这个查询并不是真的模棱两可。我非常了解其意图,BigQuery 也是如此。

比较:

WITH Singers AS (SELECT "Sinatra" LastName UNION ALL SELECT "sinatra")

SELECT UPPER(LastName) AS LastName
FROM Singers
GROUP BY Singers.LastName;

WITH Singers AS (SELECT "Sinatra" LastName UNION ALL SELECT "sinatra")

SELECT UPPER(LastName) AS LastName
FROM Singers
GROUP BY LastName;

两者的行为都符合我的预期。如果有的话,这里的文档是错误的,我已经填写了一张票,所以它得到了修复。

【讨论】:

  • 感谢您的澄清,如果文档有误,那么当前的行为正是我所期望的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多