如果值为true,则更新某些列,如果不更新其他列

时间:2018-01-22 19:33:36

标签: sql sql-server sql-server-2008

我会尝试解释我的“问题”

我有两张桌子

Table1
id      parent_id     name                  active
2008    10          name0                      Y
200801  2008        child of name0             Y
200802  2008        child of name0             Y
201102  10434344    child of name0             Y

Table2
old_id  new_id     name                active     id_father_new
2008    10         name0                  N           0
200801  202101    child of name0          N          2021
200802  202102    child of name0          N          2021
2011    10        new name0               Y           0
201101  201101    child of new name0      Y          2011
201102  10434344  child of name0          Y          2011
201102  201103  child of new name0        Y          2011

你怎么看,第一个表有一些id,id_parent和active字段。 另一个在table1中添加相同的列和新信息以及新记录。

table2中的所有新记录都插入到带有左连接的table1中,现在我需要在table1中使用table2中的信息进行更新,但前提是table2中的 active 字段为Y更新了id,id_parent和活动字段,如果table2中的活动字段为N,则只更新table1中的活动字段

所以,table1应该是这样的:

Table1
    id        parent_id     name             active
    2008         10         name0                 N
    200801      2008        child of name0        N
    200802      2008        child of name0        N
    201102      2011        child of name0        Y
    10434344    2011        child of name0        Y
    2011        10          new name0             Y           
    201101      2011        child of new name0    Y
    201103      2011        child of new name0    Y          
前三个记录中的

仅将活动字段更改为N,因为在表2中它们是活动的= N

如果我这样做:

update u
        set u.id = s.new_id,
            u.parent_id = s.new_father_id,
            u.active = s.active
        from table1 u
        inner join table2 s on u.new_id = s.old_id
        where s.active like 'Y'

显然只更新active = Y的行,并且三个第一列保留相同的值,因此必须对字段激活进行另一次更新:

update u
        set u.active = s.active
        from table1 u
        inner join table2 s on u.new_id = s.old_id

最大的问题是,¿只有一次更新才能实现这一目标吗?可能还有游标? CASE语句集合?或只是两个更新,它在sql

的良好实践中是可接受的

感谢您的时间

1 个答案:

答案 0 :(得分:0)

如果条件不是update u set u.id = IIF(s.active like 'Y', s.new_id, u.id), u.parent_id = IIF(s.active like 'Y', s.new_father_id, u.parent_id), u.active = s.active from table1 u inner join table2 s on u.new_id = s.old_id ,您可以使用IIFCASE语句并重新分配旧值。

{{1}}