如果电子邮件匹配,请复制 Sr 号码

问题描述 投票:0回答:1

我正在 SQL SERVER 2017 中进行查询。我的表有 3 列:Sr#、Email、Duplicate#。

最终目标是,如果电子邮件地址重复,则将序列号从 Sr# 列复制到 Duplicate#。例如,[email protected] email 在表中有 3 个条目,分别为 Sr# 4493、4117、4366。因此,我需要将 Sr# 4117,4366 复制到 Duplicate# 列中。该结果的示例如下所示:

sql sql-server group-by duplicates sql-update
1个回答
0
投票

这里有几件事。首先,不要在列名称中使用哈希符号等字符。这意味着您必须始终引用这些列名称,这是完全没有必要的。

其次,我真诚地希望这只是您正在执行的某种奇怪的报告格式,因为您实际上无法在前端执行此操作。如果这是持久存储格式,您需要重新考虑您的设计。

不碍事,你只需要

string_agg
你的领域在一起。然而,结果的奇怪之处在于,您想要连接当前行上
SrNo
的所有 SrNo
 除了
。这意味着您必须将电子邮件中
SrNo
值不同的数据连接到自身。

我建议您将其存储在专用字段中(即进行更新),并且您只需在查询数据时将其投影即可。但无论如何,您可以通过以下两种方式做到这一点。请注意,我假设

SrNo
是桌子上的唯一键。

drop table if exists #data
;with a (SrNo, Email, DupNo) as
(
    select 4117, '[email protected]', cast(null as varchar(max)) union all
    select 4366, '[email protected]', null union all
    select 4493, '[email protected]', null union all
    select 90210, '[email protected]', null union all
    select 1234, '[email protected]', null union all
    select 0, '[email protected]', null
)
select *
into #data
from a 

-- To just select 
;with dups as
(
    select
        AnchorSRNo = a.SrNo,
        Email = a.Email,
        DupSrNo = b.SrNo
    from #data a
    inner join #data b
        on a.Email = b.Email
            and a.SrNo != b.SrNo
)
select 
    o.*,
    DupNos = 
    (
        select string_agg(DupSrNo, ',')
        from dups i
        where o.SrNo = i.AnchorSrNo
    )
from #data o

-- To perform an update
;with dups as
(
    select
        AnchorSRNo = a.SrNo,
        Email = a.Email,
        DupSrNo = b.SrNo
    from #data a
    inner join #data b
        on a.Email = b.Email
            and a.SrNo != b.SrNo
)
update t
set DupNo = (
    select string_agg(DupSrNo, ',')
    from dups i
    where t.SrNo = i.AnchorSrNo
)
from #data t
inner join dups d
    on t.SrNo = d.AnchorSrNo
© www.soinside.com 2019 - 2024. All rights reserved.