有一个(可能是基本的)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