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

Rya*_*yan 9 google-bigquery bigquery-standard-sql

我需要一些帮助来理解 bigquery 标准 sql 中的连接。我想做一个左连接,保留 table1 中的所有列,如果 2 个字段匹配或不同的 2 个字段匹配,则连接到 table2。这应该在我的例子中更好地解释。

表格1:

id1 id2 column1  
1   a   first    
2   b   second   
3   c   third    
4   d   fourth   
5   e   fifth    
6   f   sixth
Run Code Online (Sandbox Code Playgroud)

表 2:

id3  id4    column2 
1    5674   alpha    
2    4535   bravo 
345  a      charlie  
341  b      delta
Run Code Online (Sandbox Code Playgroud)

如果 id1 = id3 OR 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
Run Code Online (Sandbox Code Playgroud)

虽然我无法得到这个结果,因为我似乎无法在 ON 子句中使用 OR 语句进行左连接。

我试过这个查询:

SELECT * FROM table1 
JOIN table2
on (table1.id1 = table2.id3) or (table1.id2 = table2.id4)
Run Code Online (Sandbox Code Playgroud)

这是一个内部联接并导致:

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
Run Code Online (Sandbox Code Playgroud)

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

尝试这个查询:

SELECT * FROM table1 
LEFT JOIN table2
on (table1.id1 = table2.id3) or (table1.id2 = table2.id4)
Run Code Online (Sandbox Code Playgroud)

结果报错:

LEFT OUTER JOIN 不能在没有连接两侧字段相等的条件下使用。

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

提前致谢,瑞安

编辑我仍在努力弄清楚为什么这是不可能的,Mikhail 的解决方法对资源非常重要,我想了解是什么阻止了我使用条件左连接。

Mik*_*ant 5

下面是 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 
)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢米哈伊尔,我会尝试在我的真实表格中采用这种方法,看看我是否遇到任何问题。虽然我有你,但你知道为什么左联接不允许 OR 语句而内联接允许吗? (3认同)