首页 > 解决方案 > MSSQL 选择父母 ID 值

问题描述

我正在管理的大型 MSSQL DB 存在一些问题。有一些我试图在一个表中实现的功能。

表外观包含这样的列:

ID              MailID
010-123456      12345678
010-123456/1    NULL
010-123456/2    NULL
010-123456/3    NULL

现在,我想要完成的是将每个 Childs MaildID 设置为与其父母 MailID 相同。

ParentID 是与“/”分隔符之前的 Child(Id ID 行)具有相同值的 ID。此外,ID 不应包含任何字符,仅包含数字(执行“-”和“/”)。

所以目前我有这个解决方案:

Declare @MyTable table(Child varchar(MAX),Parent varchar(MAX),ParentMaildId varchar(MAX))
insert into @MyTable
select ID as Child, left(ID, charindex('/', ID)-1) AS Parent, MailID as MailID
FROM [thisismy].[dbo].[table]
where ID not like '%[a-z]%' and  ID like '%/%' and MailId is not NULL

select * from @MyTable
--update t1
--SET t1.MailId = t2.ParentMaildId
--FROM [thisismy].[dbo].[table] AS t1
--INNER JOIN @IDAS t2 ON t1.ID = t2.Child
--WHERE t1.ID = t2.Child and t1.MailId is NULL

当我使用 select 语句在此处获取 MyTable 文件时,它只返回我的数据库表中所有案例的一小部分,为什么?

我希望有一个存储过程,可以自动将子项的 Mailid 更新为父项(所有需要的信息都在同一个表中)。

有一个更好的方法吗?

标签: sqlsql-serverstored-procedures

解决方案


我想你想要:

select m.*, p.mailid as imputed_parent
from @mytable m cross apply
     (select top (1) p.*
      from @mytable p
      where m.id like p.id + '/%'
      order by p.id desc
     ) p;

您可以将其放入update使用相关子查询中:

update m
    set mailid = (select top (1) p.mailid
                  from @mytable p
                  where m.id like p.id + '/%'
                  order by p.id desc
                 )
    from @mytable m
    where m.mailid is null;

是一个 db<>fiddle。


推荐阅读