首页 > 解决方案 > SQL Server - 如何记录哪些条目是重复的?

问题描述

我正在 SQL Server 中开展一个项目,以根据 3 个不同的标准创建审计数据库。这 3 个单独的查询每个都完全按照我想要的方式工作,并用于填充各自的临时表。从那以后,我使用联合将这 3 个合并到一个最终的聚合临时表中。我遇到的问题是我的一些条目符合我的多个初始查询的标准,从而创建了重复项。我想删除这些重复项,但也能够记录条目出现在多个基础上。

SELECT * INTO #all_audits FROM
(SELECT * FROM #audita 
UNION ALL
SELECT * FROM #auditb
UNION ALL
SELECT * FROM #auditc) as tmp

我首先在每个初始临时表中添加一个带有审计名称的列。这很顺利,可以告诉工会。现在我在想我应该为审计类型 2 添加另一列,以记录标记条目的第二次审计,但我不太确定如何去做。我知道更新集序列可能适用于我正在考虑的当前格式。

ALTER TABLE #all_audits  ADD AuditType2 varchar(255) 

上面的每个表都共享相同的主键。每个表还有一个“AuditType”列,用于标记它们来自哪个审计。

现在这可能很简单,但是实际执行该匹配并仍然删除重复项的代码是我卡住的地方。像这样的东西?

UPDATE #all_audits 
SET AuditType2 = AuditType
FROM #all_audits
WHERE Primary_Key IN
        (SELECT Primary_Key
        FROM #all_audits
        GROUP BY Primary Key HAVING COUNT(*)>1)

标签: sqlsql-serverdatabasedatabase-designsql-update

解决方案


如果我正确理解您的要求,您希望在不唯一auditType2的行上设置新列。primary_key

如果是这样,您可以使用窗口函数和可更新的 cte:

with cte as (
    select auditType, auditType2, count(*) over(partition by primary_key) cnt
    from  #all_audit
)
update cte set auditType2 = auditType where cnt > 1

推荐阅读