【问题标题】:Update Parent table based on child records根据子记录更新父表
【发布时间】:2016-03-28 14:25:08
【问题描述】:

大家好,我想更新父表的状态取决于子记录。

条件是。

具有字段Isclosed的子记录。

  1. 如果所有子记录 Isclosed=1 则父记录状态=1
  2. 如果某些子记录 Isclosed=1 则父记录状态=2
  3. 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。

    【讨论】:

    • 这里的WHERE条件需要什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多