通常,我需要将一个表与其自身连接,并根据匹配谓词打印出两个表中的所有列。例如
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解决方案,请告诉我!
谢谢!
答案 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)
只需选择t1
和t2
:
SELECT t1, t2 FROM `t` t1 JOIN `t` t2 USING(Id) WHERE xxxx