2016-03-28 9 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)) 

Но он удовлетворяет только одному условию.

+2

Пожалуйста, разместите образец данных и ожидаемый результат. –

ответ

3

Вы можете использовать CTE получить COUNT х годов Child записей с IsClosed = 1, а также COUNT Fo Child записи в Parent. Затем используйте результат 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

+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 

Вы можете CAST [Isclosed] в INT, если необходимо.

+0

Состояние 'WHERE' для обновления? –

+0

Что нужно для условия WHERE здесь? –

Смежные вопросы