如何基于子表中的多个值更新单个父表

时间:2017-10-12 17:47:30

标签: sql-server sql-server-2008 sql-server-2012 sql-server-2014

如果我的子表列具有单个ParentId的所有相同值,我正在尝试更新我的父表列。

T1 - 家长

|      ParentId       |    StatusId      |
|---------------------|------------------|
|          1          |       1          |
|---------------------|------------------|
|          2          |       1          |
|---------------------|------------------|

T2 - 儿童

|      ChildId        |     ParentId     |    StatusId      |
|---------------------|------------------|------------------|
|          1          |       1          |        0         |
|---------------------|------------------|------------------|
|          2          |       1          |        0         |
|---------------------|------------------|------------------|
|          3          |       1          |        0         |
|---------------------|------------------|------------------| 
|          4          |       2          |        1         |
|---------------------|------------------|------------------| 
|          5          |       2          |        0         |
|---------------------|------------------|------------------| 

如果T2状态列的全部0表示ParentId 1,则将T1中的状态设置为0,否则如果T2中的任何ParentId状态为1,则将T1中的状态设置为1或不执行任何操作。

更新声明后的所需结果:

T1 - 家长

|      ParentId       |    StatusId      |
|---------------------|------------------|
|          1          |       0          |
|---------------------|------------------|
|          2          |       1          |
|---------------------|------------------|

T2 - 儿童

|      ChildId        |     ParentId     |    StatusId      |
|---------------------|------------------|------------------|
|          1          |       1          |        0         |
|---------------------|------------------|------------------|
|          2          |       1          |        0         |
|---------------------|------------------|------------------|
|          3          |       1          |        0         |
|---------------------|------------------|------------------| 
|          4          |       2          |        1         |
|---------------------|------------------|------------------| 
|          5          |       2          |        0         |
|---------------------|------------------|------------------| 

我知道也许可以做这样的事情使用更新,也许是一个while循环,但我不太确定如何构建它。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

这可以使用Update From Select

来完成
Update T1
    Set StatusID = newStatusID
From
(
    Select ParentID as changedParentID
        , max(StatusID) as newStatusID
    From T2
    Group By ParentID
)x
Where T1.ParentID = x.changedParentID
And T1.StatusID <> x.newStatusID