BigQuery全局通配符别名(用于自我加入)

时间:2018-11-21 12:19:18

标签: google-bigquery

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

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

问题在于您会遇到列名冲突,因为它们是相同的源表/列。

是否有办法避免这种情况,但仍使用'*'?我检查了doco并在standardSQL中看不到任何选项

理想情况下,Id只希望将前缀应用于通配符投影,而不是手动/手动为每个col别名,因为我们很多表的确很宽,而且变化很大,而且手摇很费力

例如,我希望能够做这样的事情,以在T2的每个列前面加上字符串“ t2 _”

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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

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

因此,以下是BigQuery旧版SQL,您可以使用它来获取所需的结果。如果您需要标准SQL的功能来进一步处理结果-您只需将其保存在临时表中,然后用于进一步处理

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

#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

答案 1 :(得分:1)

只需选择t1t2

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