sql-server - 根据子记录更新父表

标签 sql-server sql-server-2008

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

条件是。

Child records having the field Isclosed.

  1. 如果所有子记录 Isclosed=1 那么父记录 status=1
  2. 如果一些子记录 Isclosed=1 那么父记录 status=2
  3. else Parent records status=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个条件。

最佳答案

您可以使用 CTE 获取 Child 记录的 COUNT 以及 IsClosed = 1 和每个 ParentCOUNTChild 记录。然后使用 CTE 的结果来UPDATE Parent 记录的状态:

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

关于sql-server - 根据子记录更新父表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36256001/

相关文章:

YTD、MTD、WTD 总计的 SQL 查询

sql-server - 现在如何在 SQL Server mgmt studio 中使用 DATETIME 进行插入

sql-server - SQL Server - 如何合并字符串并添加换行符?

SQL 选择列中的不同值/列中的动态值计数

sql-server-2008 - Sitecore 数据库清理错误 - 超时?

c# - 从 LINQ 调用存储过程(使用 dbcontext)

sql-server - 通过经典 ASP 从另一个存储过程调用存储过程时出现问题

sql - MSSQL - 如何根据最大 ID 选择多个列

c++ - 将 SQLFetch() 与 SQL_C_FLOAT 一起使用时出现 "Numeric value out of range"错误

sql - 列上的函数 "PROBE"可能导致表扫描