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 的解决方法对资源非常重要,我想了解是什么阻止了我使用条件左连接。
下面是 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)
| 归档时间: |
|
| 查看次数: |
4394 次 |
| 最近记录: |