BigQuery - 条件多对多连接

问题描述 投票:0回答:1

我有两张桌子,例如:

table_1          table_2
ID  CODE         ID  CODE
aa  r            qq  r
aa  k            ff  k
aa  s            aa  r
bb  r            aa  k
bb  k            aa  s
cc  r            bb  r
dd  r            bb  k
dd  k            bb  s
ee  s            cc  k
                 cc  s

我需要垂直连接它们,从 table_1 中获取所有行,并仅从 table_2 中获取 ID 等于 table_1 的行。但从这些行中仅获取 table_1 的相应 ID 中不存在 CODE 的行。 基本上是这个结果:

ID  CODE     
aa  r           
aa  k           
aa  s           
bb  r           
bb  k           
cc  r            
dd  r           
dd  k           
ee  s 
      
bb  s
cc  k
cc  s

我正在尝试这个:

SELECT * FROM table_1 t1 
UNION ALL 
SELECT * FROM table_2 t2 
WHERE t2.ID IN (SELECT DISTINCT ID FROM table_1)
AND 
t2.CODE NOT IN (SELECT DISTINCT CODE FROM table_1)

这仅适用于第一个 WHERE,但第二个 WHERE 是错误的,因为我需要获取 table_1 的每个 ID 中的代码列表,而不是一般的 ID。 上面的查询可能会在每个 ID 的 FOR 循环中工作,但我想避免这种情况,因为太慢了。

我考虑使用连接来过滤我需要的内容,例如:

SELECT * FROM table_1 
UNION ALL 
SELECT t2.* FROM table_2 t2 
LEFT JOIN table_1 t1
ON t1.ID = t2.ID
WHERE t2.CODE != t1_CODE

但这也是错误的,因为我是逐行排除而不是按 ID 组排除...

救命!

join google-bigquery union
1个回答
0
投票

这可以使用

EXISTS
:

来完成
SELECT *
FROM table_1
UNION ALL
SELECT ID, CODE
FROM table_2 t2
WHERE EXISTS (
  SELECT 1
  FROM table_1 t1
  WHERE t2.ID = t1.ID 
        AND t2.CODE NOT IN ( SELECT CODE FROM table_1 WHERE ID = t2.ID)
);

mysql 演示

© www.soinside.com 2019 - 2024. All rights reserved.