一次更新多行的SQL查询

时间:2013-04-20 20:35:52

标签: sql-server-2008

我需要帮助编写更新查询,以帮助我清理下表。我一直在手动做每一行,这只是漫长而艰辛的过程。

有没有办法编写一次更新整个表的更新查询。

The rules:
1. All fields ending with m1 should only contain a value of 'aprn' 
2. All fields ending with m2 should only contain a value of 'pa'
3. If 'pa' does exist in a field ending with m1 then that means that field should be NULL and the value 'pa' should be moved to the m2 column. 


table_a
org_id org_name     a_m1   a_m2    b_m1     b_m2
1       north       aprn   pa      aprn     pa
2       south       null   null    pa       null
3       east        pa     null    pa       null
4       west        null   pa      null     pa


Correct: ORG_ID=1 (a_m1, a_m2, b_m1, b_m2)
Correct: ORG_ID=4 (a_m1, a_m2, b_m1, b_m2)
Correct: ORG_ID=2 (a_m1, a_m2)

Incorrect: ORG_ID=2 (b_m1, b_m2)
Incorrect: ORG_ID=3 (a_m1, a_m2, b_m1, b_m2)

2 个答案:

答案 0 :(得分:0)

update table_a
set
a_m2 = case when a_m1 = 'pa' or a_m2 = 'pa' then 'pa' end
, b_m2 = case when b_m1 = 'pa' or b_m2 = 'pa' then 'pa' end
, a_m1 = case when a_m1 = 'aprn' then a_m1 end
, b_m1 = case when b_m1 = 'aprn' then b_m1 end

SQL Fiddle with demo

它肯定适用于您的数据集。如果这不适合您,请在您的问题中添加更多详细信息。

答案 1 :(得分:0)

如果我理解你的问题,我怀疑多个更新语句可能是最好的。我喜欢用更改数据的语句做的一件事就是保持简单。我更喜欢写多个语句,让RDBMS做更多的工作,慢一些,但总是正确的。可能很难从错误的数据更改中恢复。

我不确定我是否完全理解您的标准,但类似于以下内容。如果我理解正确,你需要在1.和2之前运行3.?

  1. update table_a
       set a_m1 = 'aprn'
     where a_m1 = 'pa';
    
  2. update table_a
       set a_m2 = 'pa'
     where a_m2 = 'aprn';
    
  3. update table_a
       set a_m1 = NULL
       set a_m2 = 'pa'
     where a_m1 = 'pa';
    
    update table_a
       set b_m1 = NULL
       set b_m2 = 'pa'
     where b_m1 = 'pa';