2016-03-28 30 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

あなたはIsClosed = 1ChildレコードともParentあたりCOUNTChild FOレコードのCOUNT Sを取得するためにCTEを使用することができます。その後ParentレコードのCTEUPDATEにステータスの結果を使用します。この単純な文字列で検索してください

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 

必要に応じてINTにCAST [Isclosed]することができます。

+0

更新のためのWHERE条件? –

+0

ここにWHERE条件が必要ですか? –

関連する問題