我有两张桌子,例如:
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 组排除...
救命!
这可以使用
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)
);