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



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

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

这样做的问题是,您会遇到列名冲突,因为它们在每个列中都是相同的源表/列。

有没有一种方法可以避免这种情况,但仍然使用"*"?我检查了文档,在标准SQL 中看不到任何选项

理想情况下,我只想在通配符投影中应用一个前缀,而不是单独/手动地手动别名每个列,因为我们的许多表都很宽,而且会发生变化,手动拖动只是很费力的

例如,我想做这样的事情,在T2的每一列前面加上字符串"T2_">

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

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

谢谢!

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

所以,下面是BigQueryLegacySQL,您可以使用它来获得所需的结果。如果您需要Standard 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

只需选择t1t2即可:

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

最新更新