BigQuery 自联接通配符的全局别名

BigQuery Global Alias of Wildcard for Self Join

通常我需要将一个表连接到自身,并根据匹配谓词,打印出两个表中的所有列。例如

SELECT t1.*, t2.*
FROM `t` t1
JOIN `t` t2
USING(Id)
WHERE xxxx

这个问题是你得到列名冲突,因为它们是相同的源表/列。

有没有办法避免这种情况但仍然使用'*'?我检查了 doco,但在标准 SQL

中看不到任何选项

理想情况下,我只想将前缀应用于通配符投影,而不是单独/手动手动为每个 col 设置别名,因为我们的许多表都非常宽,并且不断变化,手动操作很费力

例如,我希望能够做这样的事情来为 T2 的每个列加上字符串"t2_"

SELECT t1.*, t2.* PREFIX("t2_")
FROM `t` t1
JOIN `t` t2
USING(Id)
WHERE xxxx

目前可能没有像这样干净的解决方案,除非我在文档中错过了它(希望如此!),如果有任何使用其他方法的临时 SQL 解决方案,请告诉我!

谢谢!


下面的方法有点争议,因为它指向 BigQuery Legacy SQL 中的功能 - 但为什么不方便时使用它们:o)

因此,以下是 BigQuery Legacy SQL,您可以使用它来获得您需要的结果。如果您需要标准 SQL 的功能来进一步处理该结果 - 您可以简单地将其保存在临时表中,而不是用于进一步处理

同时,下面的代码不需要你指定列并且结果被展平

1
2
3
4
5
6
#legacySQL
SELECT *
FROM [project:dataset.table] t1
JOIN [project:dataset.table] t2
ON t1.Id = t2.Id  
WHERE xxxx

这里的诀窍是表中的所有列别名为 t1 - 将以 t1_ 为前缀,如 t1_col1, t1_col2 等等;并且来自 t2 的所有列都将以 t2_ 为前缀,例如 t2_col1, t2_col2 等等 - 所以没有 column name collisions


只需选择 t1t2 即可:

1
SELECT t1, t2 FROM `t` t1 JOIN `t` t2 USING(Id) WHERE xxxx