【发布时间】: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