2016-03-28 53 views
2

大家好我想更新父表的狀態取決於子記錄。更新基於子記錄的父表格

條件是。

子字段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)) 

但它只滿足1個條件。

+2

請發佈樣本數據和預期結果。 –

回答

3

您可以使用CTEParentIsClosed = 1也得到COUNT S的Child記錄COUNT FO Child記錄。然後使用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

+0

是的。我會試試看。 –

0

試試這個簡單的查詢,可幫助您

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 
0

只需經過下面的查詢。

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 

如果需要,可以將[已關閉]設爲[已關閉]。

+0

'WHERE'條件更新? –

+0

這裏的WHERE條件需要什麼? –

相關問題