如何在不使用其他表的情况下更新子记录的值



有一个(可能是基本的)SQL问题!

考虑这个表

create TestTable( 
name [nvarchar](30) NULL,
record [nvarchar](10) NULL,
parentRecord [nvarchar](10) NULL,
parentID [nvarchar](10) NULL)
insert into TestTable
values ('Child_A', '111', '000', NULL),
('Child_B', '222', '000', NULL),
('Parent_1, '000', NULL, 'xyz'),
('Child_C', '333', '999', NULL),
('Parent_2', '999', NULL, 'qrs')

Child_A和Child_B通过parentString与Parent_1关联。Parent_1的parentID为"xyz"我希望Child_A和Child_B的parentID也为&;xyz&;(目前为null)。对于Child_C和Parent_2也是如此。

如何在不使用另一个表的情况下做到这一点?例如,我可以用另一个表实现这一点,如下所示:

create Helper(
record [nvarchar](10) NULL,
parentRecord [nvarchar](10) NULL,
parentID [nvarchar](10) NULL)
insert into helper
select record, parentString, parentID from TestTable
where parentID is not null
update tt
set tt.parentID = h.parentID
from TestTable tt, helper h,
where tt.parentString = h.record
and tt.parentString is not null

所以这是可行的,但我必须创建另一个表。有没有一种方法可以在不使用另一张桌子的情况下实现我的目标?谢谢!

您可以通过使用apply()updatable CTE来实现自连接

with u as (
select * 
from TestTable t
cross apply (
select parentId NewParent
from TestTable t2
where t2.record=t.parentrecord
)p
)
update u set parentId=newParent

您可以加入一个子查询,然后更新

create TABLE TestTable( 
name [nvarchar](30) NULL,
record [nvarchar](10) NULL,
parentRecord [nvarchar](10) NULL,
parentID [nvarchar](10) NULL);
GO
insert into TestTable
values ('Child_A', '111', '000', NULL),
('Child_B', '222', '000', NULL),
('Parent_1', '000', NULL, 'xyz'),
('Child_C', '333', '999', NULL),
('Parent_2', '999', NULL, 'qrs')
GO
5行
UPDATE TestTable
SET TestTable.parentID = h.parentID
FROM TestTable tt
INNER JOIN (SELECT * FROM TestTable where parentID is not null) h
ON tt.parentRecord = h.record
and tt.parentRecord is not null
GO
SELECT * FROM TestTable
GO
name | record | parentRecord | parentID:------- |:----- |:----------- |:-------Child_A | 111 | 000 | xyzChild_B | 222 | 000 | xyzParent_1 | 000 |null| xyzChild_C | 333 | 999 | qrsParent_2 | 999 |null| qrs

db<>fiddle here

相关内容

  • 没有找到相关文章

最新更新