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 解决方案,请告诉我!
谢谢!
- 在输出中复制所有列的实际用途是什么?
-
我想我可以看到很少这样的用例 :o) 但仍然对你的究竟是什么感到好奇——如果你能分享的话
-
我的用例是将 bq 版本(例如视图)的输出(增量/差异)与前一版本认证的黄金参考表进行比较。对我们的观点进行回归测试的形式。它们是相同的表输出,相同的列,但我想找到差异,当我这样做时,输出黄金和当前版本的所有列。
-
扁平化的原因也是 Tableau(我们报告 bq 回归结果的地方)不幸的是更喜欢这样的数据......下面的 Elliotts 响应实现了除扁平化之外的一般需求。
-
正在使用 TO_JSON_STRING 构建一些通用表比较 SQL,只是试图展平输出而不是拥有顶级记录/结构....谢谢!
-
说得通。这正是我认为您的用例可能是的。感谢你的分享
-
哈 - 谢谢你,我经常在这里使用你的建议,你是一个顶尖的人,并且喜欢你对我的热度接近和亲爱的产品的贡献! :) 。所以也谢谢你
-
哇。谢谢你的好话。他们启发我为您提供新的答案:o)希望它会有所帮助
-
你的利率很低。对 SO 很重要 - 您可以使用已发布答案左侧投票下方的勾号 mark accepted answer。请参阅 meta.stackexchange.com/questions/5234/... 了解为什么它很重要!对 vote on answer 也很重要。投票选出有帮助的答案。 ...您可以检查当有人回答您的问题时该怎么做 - stackoverflow.com/help/someone-answers。遵循这些简单的规则,您可以提高自己的声誉得分,同时让我们有动力回答您的问题 :o) 请考虑!
下面的方法有点争议,因为它指向 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
-
凉爽的!我总是遇到一个问题,即标准 SQL 视图无法针对此类功能差距调用 legacySQL 视图,但是,对于我的用例而言,在这种情况下这可能不是问题......让我试一试...... ..感谢并继续为 BQ 出色的社区英雄工作! :)
只需选择 t1 和 t2 即可:
1
| SELECT t1, t2 FROM `t` t1 JOIN `t` t2 USING(Id) WHERE xxxx |
- 大声笑-不错的简单选择:)。我试图展平整个结果集是唯一的事情,但是,也许这需要做。赞赏。