我需要帮助编写更新查询,以帮助我清理下表。我一直在手动做每一行,这只是漫长而艰辛的过程。
有没有办法编写一次更新整个表的更新查询。
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)
答案 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
它肯定适用于您的数据集。如果这不适合您,请在您的问题中添加更多详细信息。
答案 1 :(得分:0)
如果我理解你的问题,我怀疑多个更新语句可能是最好的。我喜欢用更改数据的语句做的一件事就是保持简单。我更喜欢写多个语句,让RDBMS做更多的工作,慢一些,但总是正确的。可能很难从错误的数据更改中恢复。
我不确定我是否完全理解您的标准,但类似于以下内容。如果我理解正确,你需要在1.和2之前运行3.?
update table_a
set a_m1 = 'aprn'
where a_m1 = 'pa';
update table_a
set a_m2 = 'pa'
where a_m2 = 'aprn';
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';