【问题标题】:Update Parent table based on child records根据子记录更新父表
【发布时间】:2016-03-28 14:25:08
【问题描述】:
大家好,我想更新父表的状态取决于子记录。
条件是。
具有字段Isclosed的子记录。
- 如果所有子记录
Isclosed=1 则父记录状态=1
- 如果某些子记录
Isclosed=1 则父记录状态=2
- else 父记录状态=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))
但它只满足一个条件。
【问题讨论】:
标签:
sql-server
sql-server-2008
【解决方案1】:
您可以使用CTE 来获取Child 记录的COUNTs 和IsClosed = 1 以及COUNT fo Child 记录每个Parent。然后使用CTE的结果来UPDATEParent的状态记录:
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
SQL Fiddle
【解决方案2】:
试试这个简单的查询,可能对你有帮助
UPDATE P
SET P.status = (CASE WHEN MaxIsclosed = MinIsclosed AND MaxIsclosed > 0 THEN 1
WHEN MaxIsclosed > 0 THEN 2 ELSE 3 END)
FROM Parent P
LEFT OUTER JOIN (SELECT PARENTID,MAX(Isclosed) AS MaxIsclosed,MIN(Isclosed) AS MinIsclosed
FROM CHILD GROUP BY PARENTID) C ON P.PARENTID = C.PARENTID
【解决方案3】:
只需通过以下查询。
UPDATE [Parent]
SET [Status] = CASE WHEN EXISTS ( SELECT [ParentID]
FROM [Child]
WHERE [ParentID] = [Parent].[id]
GROUP BY [ParentID]
HAVING SUM([Isclosed]) = COUNT([ParentID])
)
THEN 1
WHEN EXISTS ( SELECT [ParentID]
FROM [Child]
WHERE [ParentID] = [Parent].[id]
GROUP BY [ParentID]
HAVING SUM([Isclosed]) = 0
)
THEN 3
ELSE 2
END
如果需要,您可以将 [已关闭] 转换为 INT。