我需要一些帮助来了解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的解决方法非常占用资源,我想了解是什么阻止了我使用条件左联接。
答案 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
)