【问题标题】:How does this odd BigQuery SQL syntax work?这种奇怪的 BigQuery SQL 语法是如何工作的?
【发布时间】:2022-01-04 13:57:33
【问题描述】:

我对 BigQuery 比较陌生,但多年来我一直在编写 SQL;所以当我发现这样一个同事写的查询时,你可以想象我的惊讶:(简化)

SELECT
    t1.user_id,
    t2.value,
    MAX(t1.order_id) 
FROM orders t1, 
    (SELECT 
         value
     FROM products) t2
WHERE t1.order_id > t2.value
GROUP BY 1, 2

他正在从两个表中进行选择,但没有加入它们 - 每个表只用逗号分隔!这是 SQL 中的正常现象还是 BigQuery 独有的连接简写?它是如何工作的?

【问题讨论】:

  • 这是原来的加入方式。但首选 1992 年的显式 JOIN。仅仅几年,我就学会了一个 60 多岁的同事使用明确的 JOIN 语法。

标签: sql google-bigquery


【解决方案1】:

它是标准 SQL,适用于任何地方(至少表列表部分。GROUP BY 1, 2 不适用于任何地方),并且与此相同:

SELECT
    t1.user_id,
    t2.value,
    MAX(t1.order_id) 
FROM orders t1
CROSS JOIN (
  SELECT value
  FROM products
) t2
WHERE t1.order_id > t2.value
GROUP BY 1, 2

如果您在FROM 子句中列出多个表,您将得到所有列出的表之间的叉积。

【讨论】:

  • 我宁愿做INNER JOIN (SELECT value FROM products) t2 ON t1.order_id > t2.value
  • @jarlh:是的,但这是另一个重构步骤,我认为这无助于解释表列表的作用。
  • 下一步根本没有派生表!
  • @jarlh:请随意提供一个 7 步重构的答案! :)
猜你喜欢
  • 1970-01-01
  • 2021-01-12
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2021-11-13
相关资源
最近更新 更多