【问题标题】:Google BigQuery equivalent of MySQL multi-table inner join相当于 MySQL 多表内连接的 Google BigQuery
【发布时间】:2018-10-22 14:47:59
【问题描述】:

我想知道如何在 Google BigQuery 中编写类似于 MySQL 的多表连接:

SELECT t2.*, t1.*, t3.* FROM table1 t1, table2 t2, table t3 WHERE t1.field_a=t2.field_a AND t2.field_b=t3.field_b AND t1.field_condition=10

请注意,我以特定顺序请求表格的顺序,但使用了星号功能。

有什么想法吗?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    一个较短的,当列匹配名称时(如问题中所示):

    #standardSQL
    WITH t_a AS (SELECT 1 id_a, 2 v)
    , t_b AS (SELECT 1 id_a, 2 id_c, 3 w)
    , t_c AS (SELECT 2 id_c, 5 z)
    
    SELECT *
    FROM t_a
    JOIN t_b USING(id_a)
    JOIN t_c USING(id_c)
    

    【讨论】:

      【解决方案2】:

      以下是 BigQuery 标准 SQL

      #standardSQL
      SELECT t2.*, t1.*, t3.* 
      FROM table1 t1
      JOIN table2 t2 ON t1.field_a=t2.field_a 
      JOIN table t3 ON t2.field_b=t3.field_b 
      WHERE t1.field_condition=10
      

      以上假设字段名称没有歧义

      同时,以下仍然适用于 BigQuery 标准 SQL

      SELECT t2.*, t1.*, t3.* FROM table1 t1, table2 t2, table t3 WHERE t1.field_a=t2.field_a AND t2.field_b=t3.field_b AND t1.field_condition=10   
      

      并且等价于

      #standardSQL
      SELECT t2.*, t1.*, t3.* FROM table1 t1
      CROSS JOIN table2 t2
      CROSS JOIN table t3 
      WHERE t1.field_a=t2.field_a AND t2.field_b=t3.field_b AND t1.field_condition=10   
      

      【讨论】:

      • 请注意,这些查询将给出“不支持结果中的重复列名”(可通过​​删除 .*s 来修复)
      • 感谢 Felipe 在这个重要方面的双重承诺。是的。正如我所提到的 - 上面假设 there is no ambiguity in fields names 。否则,用户需要在 SELECT 语句中提供特定的字段列表或使用 USING(key) 语法 - 仍然假设没有其他不明确的字段而不是键 - 所以可以使用 SELECT *。如果不是 - 仍然是要使用的明确字段列表
      猜你喜欢
      • 2013-09-29
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 2020-03-04
      • 2013-01-18
      • 1970-01-01
      • 2018-05-20
      相关资源
      最近更新 更多