如何基于子表中的多个值更新单个父表
问题描述:
我想更新我的父表列,如果我的子表列具有单个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,否则,如果有一个1状态为T2中的任何ParentId,然后将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循环,但我不太清楚如何构造它。任何帮助表示赞赏。
答
这可以使用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
+0
这是一个非常简单但很好的解决方案。有时候问题的答案可能会很小,但是当你不需要的时候,你会发现你的时间寻找更难的解决方案。 – CursiosAsEver69
你尝试过什么到目前为止做些什么呢? – Eric
UPDATE PT SET PT.StatusId = CASE WHEN PT.StatusId = 1 THEN 1 WHEN CT.StatusId IN(0,1)THEN 1 END FROM ParentTable PT JOIN ChildTable CT ON PT.ParentID = CT.ParentId – CursiosAsEver69
作为一般规则,尽量避免while循环。 –