如何取联合写入同一个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 ALEFT 连接,只获取将插入到 [= 的不匹配行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 运算符 <=> 也将比较 nulls。
我假设并非所有列都在同一行中包含 null

如果您希望 B 中的行覆盖 A 中匹配的行,那么您可以使用:

REPLACE INTO A (a,b,c) 
 SELECT a,b,c FROM B;

请注意,这只会检测 "matching" 行,因为这些行的主键或唯一键具有相同的值。