如何记录哪些条目是重复的?

mctunoxg  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(255)

我正在SQLServer中的一个项目中使用3个不同的条件创建审计数据库。这3个独立的查询每个都按照我希望的方式工作,并用于填充各自的temp表。从那以后,我使用了一个联合将这3个合并到一个最终的聚合临时表中。我遇到的问题是,我的一些条目满足多个初始查询的条件,从而创建了重复项。我想删除这些重复,但也能够记录的条目出现在多个基地。

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

我首先在每个初始temp表中添加一列,其中包含审计的名称。这项工作毫无悬念地成功了,能够向工会说明情况。现在我在想应该为audittype2添加另一个列,以记录条目被标记的第二个审计,但我不太确定如何进行。我知道更新集序列可能适用于我正在考虑的当前格式。

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)
68bkxrlz

68bkxrlz1#

如果我正确理解了你的要求,你想设置一个新的栏目吗 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
yxyvkwin

yxyvkwin2#

我建议将表创建为:

SELECT a.*,
       STRING_AGG(this_audit, ',') OVER (PARTITION BY primarykey) as all_audits
INTO #all_audits
FROM (SELECT a.*, 'a' as this_audit FROM #audita a
      UNION ALL
      SELECT a.*, 'b' as this_audit FROM #auditb a
      UNION ALL
      SELECT a.*, 'c' as this_audit FROM #auditc a
     ) a;

这会将所有审核连接在一起,因此不会假定“主键”仅在一个审核中。

相关问题