使用三个主键在两个相同的表之间选择公用数据

时间:2018-09-03 14:40:19

标签: sql sql-server select ssms primary-key

我有两个表,例如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语句,我应该只获取第一行数据,因为其他行中都有唯一的数据。

2 个答案:

答案 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。