如何取联合写入同一个table?
How to take union and write into the same table?
我有一个 table A 和列 (x, y, z),我有另一个 table B 和列 (x, y, z),基本相同的模式。
我想将B中的那些行添加到A中,这些行在A中尚不存在,基本上操作后A和B的并集存在于table A中
如何在 sql 中执行此操作?
我的意思是我知道如何参加工会,我在想类似的事情:
INSERT OVERWRITE TABLE A
(SELECT a, b, c FROM A
union
SELECT a, b, c FROM B)
但这似乎不对,因为我是从我正在写入的 table 中选择的。
I want to add those rows from B into A, which do not already exist in A.
想法是在 之前过滤 插入 table:
INSERT INTO TABLE A (a, b, c)
SELECT a, b, c
FROM B
WHERE NOT EXISTS (SELECT 1
FROM A
WHERE B.a = A.a AND B.b = A.b AND B.c = A.c
);
注意:这不会过滤掉重复的 NULL
值,但也很容易处理(它只是使逻辑稍微复杂了一点)。
如果要使用合并的行创建新的 table,可以使用 UNION
。
您可以使用 table B
到 table A
的 LEFT
连接,只获取将插入到 [= 的不匹配行26=] A
:
INSERT INTO A (x, y, z)
SELECT B.x, B.y, B.z
FROM B LEFT JOIN A
ON A.x <=> B.x AND A.y <=> B.y AND A.z <=> B.z
WHERE COALESCE(A.x, A.y, A.z) IS NULL
NULL-safe equal 运算符 <=>
也将比较 null
s。
我假设并非所有列都在同一行中包含 null
。
如果您希望 B 中的行覆盖 A 中匹配的行,那么您可以使用:
REPLACE INTO A (a,b,c)
SELECT a,b,c FROM B;
请注意,这只会检测 "matching" 行,因为这些行的主键或唯一键具有相同的值。
我有一个 table A 和列 (x, y, z),我有另一个 table B 和列 (x, y, z),基本相同的模式。
我想将B中的那些行添加到A中,这些行在A中尚不存在,基本上操作后A和B的并集存在于table A中
如何在 sql 中执行此操作?
我的意思是我知道如何参加工会,我在想类似的事情:
INSERT OVERWRITE TABLE A
(SELECT a, b, c FROM A
union
SELECT a, b, c FROM B)
但这似乎不对,因为我是从我正在写入的 table 中选择的。
I want to add those rows from B into A, which do not already exist in A.
想法是在 之前过滤 插入 table:
INSERT INTO TABLE A (a, b, c)
SELECT a, b, c
FROM B
WHERE NOT EXISTS (SELECT 1
FROM A
WHERE B.a = A.a AND B.b = A.b AND B.c = A.c
);
注意:这不会过滤掉重复的 NULL
值,但也很容易处理(它只是使逻辑稍微复杂了一点)。
如果要使用合并的行创建新的 table,可以使用 UNION
。
您可以使用 table B
到 table A
的 LEFT
连接,只获取将插入到 [= 的不匹配行26=] A
:
INSERT INTO A (x, y, z)
SELECT B.x, B.y, B.z
FROM B LEFT JOIN A
ON A.x <=> B.x AND A.y <=> B.y AND A.z <=> B.z
WHERE COALESCE(A.x, A.y, A.z) IS NULL
NULL-safe equal 运算符 <=>
也将比较 null
s。
我假设并非所有列都在同一行中包含 null
。
如果您希望 B 中的行覆盖 A 中匹配的行,那么您可以使用:
REPLACE INTO A (a,b,c)
SELECT a,b,c FROM B;
请注意,这只会检测 "matching" 行,因为这些行的主键或唯一键具有相同的值。