【问题标题】:How to update value of child record without using another table如何在不使用另一个表的情况下更新子记录的值
【发布时间】:2021-10-20 14:49:35
【问题描述】:

有一个(可能是基本的)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”(当前为空)。 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

所以这行得通,但我必须创建另一个表才能这样做。有没有办法在不使用另一个表的情况下实现我的目标?谢谢!

【问题讨论】:

  • 你的设计是错误的,你应该只通过记录ID将孩子链接到父母,而不是名字。但是可以将您的表重新加入到您的更新中 - 不需要另一个表。

标签: sql sql-server tsql sql-update


【解决方案1】:

您可以通过使用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

【讨论】:

    【解决方案2】:

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

    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
    
    姓名 |记录 |父记录 |父母ID :------- | :----- | :----------- | :-------- 孩子_A | 111 | 000 | xyz 孩子_B | 222 | 000 | xyz 父_1 | 000 | | xyz 孩子_C | 333 | 999 | qrs 父_2 | 999 | | qrs

    db小提琴here

    【讨论】:

      猜你喜欢
      • 2010-09-17
      • 2011-04-22
      • 2017-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2021-02-13
      相关资源
      最近更新 更多