我可以删除基于多列的数据库副本吗?

leo*_*ora 12 database sql-server

暂时问了这个问题,根据列删除重复记录.答案很有效:

delete from tbl
where id NOT in
(
select  min(id)
from tbl
group by sourceid
)
Run Code Online (Sandbox Code Playgroud)

我现在有一个类似的情况,但重复记录的定义基于多个列.如何更改上面的SQL以识别重复记录,其中唯一记录定义为从Col1 + Col2 + Col3连接.我会做这样的事情吗?

delete from tbl
where id NOT in
(
select  min(id)
from tbl
group by col1, col2, col3
)
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 25

这显示了您要保留的行:

;WITH x AS 
(
  SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
      (PARTITION BY col1, col2, col3 ORDER BY id)
  FROM dbo.tbl
)
SELECT col1, col2, col3 FROM x WHERE rn = 1;
Run Code Online (Sandbox Code Playgroud)

这会显示您要删除的行:

;WITH x AS 
(
  SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
      (PARTITION BY col1, col2, col3 ORDER BY id)
  FROM dbo.tbl
)
SELECT col1, col2, col3 FROM x WHERE rn > 1;
Run Code Online (Sandbox Code Playgroud)

一旦你对以上两组是正确的感到高兴,以下实际上将删除它们:

;WITH x AS 
(
  SELECT col1, col2, col3, rn = ROW_NUMBER() OVER 
      (PARTITION BY col1, col2, col3 ORDER BY id)
  FROM dbo.tbl
)
DELETE x WHERE rn > 1;
Run Code Online (Sandbox Code Playgroud)

请注意,在所有三个查询中,前6行是相同的,只有CTE更改后的后续查询.