我正在 SQL SERVER 2017 中进行查询。我的表有 3 列:Sr#、Email、Duplicate#。
最终目标是,如果电子邮件地址重复,则将序列号从 Sr# 列复制到 Duplicate#。例如,[email protected] email 在表中有 3 个条目,分别为 Sr# 4493、4117、4366。因此,我需要将 Sr# 4117,4366 复制到 Duplicate# 列中。该结果的示例如下所示:
这里有几件事。首先,不要在列名称中使用哈希符号等字符。这意味着您必须始终引用这些列名称,这是完全没有必要的。
其次,我真诚地希望这只是您正在执行的某种奇怪的报告格式,因为您实际上无法在前端执行此操作。如果这是持久存储格式,您需要重新考虑您的设计。
不碍事,你只需要
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