在ON子句BigQuery Standard SQL中使用OR的LEFT JOIN

时间:2018-07-20 14:19:47

标签: google-bigquery standard-sql

我需要一些帮助来了解bigquery标准sql中的联接。我想做一个左连接,将所有列保留在表1中,如果两个字段匹配或另一个两个字段匹配,则连接到表2。在我的示例中应该对此做更好的解释。

表1:

id1 id2 column1  
1   a   first    
2   b   second   
3   c   third    
4   d   fourth   
5   e   fifth    
6   f   sixth

表2:

id3  id4    column2 
1    5674   alpha    
2    4535   bravo 
345  a      charlie  
341  b      delta

如果id1 = id3或id2 = id4,我想保留table1中的所有行以及table2中的所有行,结果表将如下所示:

结果:

id1 id2 column1 id3 id4     column2  
1   a   first   1   5674    alpha    
1   a   first   345 a       charlie  
2   b   second  2   4535    bravo    
2   b   second  341 b       delta
3   c   third    
4   d   fourth   
5   e   fifth    
6   f   sixth

尽管我无法获得此结果,因为似乎无法对ON子句中的OR语句进行左连接。

我已经尝试过以下查询:

SELECT * FROM table1 
JOIN table2
on (table1.id1 = table2.id3) or (table1.id2 = table2.id4)

这是一个内部联接,其结果为:

id1 id2 column1 id3 id4     column2  
1   a   first   1   5674    alpha    
1   a   first   345 a       charlie  
2   b   second  2   4535    bravo    
2   b   second  341 b       delta

几乎在那里,但不包括table1中的其他行

尝试此查询:

SELECT * FROM table1 
LEFT JOIN table2
on (table1.id1 = table2.id3) or (table1.id2 = table2.id4)

导致错误:

  

如果没有以下条件,则无法使用左外连接   连接两端的字段相等。

我了解可能有一个解决方法,我很想听听,但是也很高兴理解为什么相同的内部联接方法不适用于左联接。

预先感谢, 瑞安

编辑 我仍在努力弄清为什么不可能做到这一点,Mikhail的解决方法非常占用资源,我想了解是什么阻止了我使用条件左联接。

1 个答案:

答案 0 :(得分:2)

以下是用于BigQuery标准SQL

其中一个选项:

#standardSQL
SELECT DISTINCT * FROM (
  SELECT * FROM `project.dataset.table1` 
  LEFT JOIN `project.dataset.table2` 
  ON id1 = id3   
  UNION ALL
  SELECT * FROM `project.dataset.table1` 
  LEFT JOIN `project.dataset.table2` 
  ON id2 = id4 
)