根据子记录更新父表

San*_*yak 3 sql-server sql-server-2008

大家好,我想根据子记录更新父表的状态。

条件是。

具有该字段的子记录Isclosed

  1. 如果所有子记录Isclosed=1则父记录状态=1
  2. 如果某些子记录Isclosed=1则父记录状态=2
  3. 否则父记录状态=3

我试过这个:

update Parent set Status=1
where id in(
select ParentID from Child where
Isclosed=1  
 group by ParentID having count(id)=(select count(id)from Child where Parent.id=ParentID))
Run Code Online (Sandbox Code Playgroud)

但它只满足1个条件。

Fel*_*tan 5

您可以使用 aCTE来获取的记录COUNT的 s以及per的fo记录。然后将结果用于记录的状态:ChildIsClosed = 1COUNTChildParentCTEUPDATEParent

WITH Cte AS(
    SELECT
        p.Id,
        ClosedCount = SUM(CASE WHEN c.IsClosed = 1 THEN 1 ELSE 0 END),
        TotalCount = COUNT(*)
    FROM Parent p
    INNER JOIN Child c
        ON c.ParentId = p.Id
    GROUP BY p.Id
)
UPDATE p
    SET p.Status =
        CASE
            WHEN c.ClosedCount = c.TotalCount THEN 1
            WHEN c.ClosedCount = 0 THEN 3
            ELSE 2          
        END
FROM Parent p
INNER JOIN Cte c
    ON c.Id = p.Id
Run Code Online (Sandbox Code Playgroud)

SQL小提琴