我有两个表,例如table1和table2。它们具有完全相同的列和主键,并且具有完全相同的用途。而且,table2比table1更新并且具有更新的数据。我想合并它们,但是首先我必须从table1中已经存在的table1中删除数据。
这是我的伪代码:
Delete from table1
where pk1, pk2, pk3 in (select pk1, pk2, pk3 from table2)
查询简单吗?
Delete from table1
where pk1 in (select pk1 from table2)
and pk2 in (select pk2 from table2)
and pk3 in (select pk3 from table2)
例如,在Table1
中,我们有:
pk1 | pk2 | pk3
000 | 001 | 001
000 | 002 | 001
000 | 002 | 002
Table2
,我们有:
pk1 | pk2 | pk3
000 | 001 | 001
ABC | 002 | 001
ABC | 002 | 002
如果使用select语句,我应该只获取第一行数据,因为其他行中都有唯一的数据。
答案 0 :(得分:3)
您可以使用LEFT JOIN
来标识Table1中不存在的行,而不是从Table1中删除-然后同时插入所有新数据,从而仅产生一个查询,而不是两个查询:
INSERT INTO Table1
SELECT Table2.* FROM Table2 LEFT JOIN Table1
ON Table2.pk1 = Table1.pk1
AND Table2.pk2 = Table1.pk2
AND Table2.pk3 = Table1.pk3
WHERE Table1.pk1 IS NULL
任何与左连接参数中指定的所有条件都不匹配的Table1数据将作为NULL
返回-因此,WHERE
语句中仅需要一个pk列。
编辑:当您希望将新值更新为已存在的行时,可以将WHERE Table1.pk1 IS NULL
替换为以下内容:
ON DUPLICATE KEY UPDATE Table1.X = Table2.X, Table1.Y = Table2.Y etc.
这是假设您已经对三个pk值应用了唯一索引(它应该是您的主键)-如果没有,请对表应用以下内容:
ALTER TABLE Table1
ADD CONSTRAINT pk_idx PRIMARY KEY (pk1, pk2, pk3);
让我知道您是否还需要其他:)
答案 1 :(得分:2)
您可能需要使用EXISTS
:
DELETE T1
FROM Table1 T1
WHERE EXISTS (SELECT 1
FROM Table2 T2
WHERE T1.pk1 = T2.pk1
AND T1.pk2 = T2.pk2
AND T1.pk3 = T2.pk3);
您提供的SQL可能无法按预期工作。例如,如果您在Table1
中包含以下行:
1,4,5
6,2,7
8,9,3
以及Table2
中的下一行:
1,2,3
在Table1
中不会删除所有行,因为Table2
中存在所有这些ID。