我有2个SQL表,其中一个表包含源列和目标列,另一个表包含源值的转换逻辑。我需要应用转换逻辑并更新目标列。
表1
ID | PreVal |PostVal
1 | 5 |
1 | 6 |
1 | 7 |
2 | 10 |
2 | 15 |
表2 - 转换逻辑
ID | Logic
1 | case when PreVal < 6 then 1 else 0 end
2 | case when PreVal < 12 then 1 else 0 end
通过连接两个表(而不是通过遍历游标中的每个ID构建动态SQL)来实现以下输出,是否可以只有一个公共更新语句
ID | PreVal |PostVal
1 | 5 | 1
1 | 6 | 0
1 | 7 | 0
2 | 10 | 1
2 | 15 | 0
非常感谢你的帮助。
答案 0 :(得分:0)
将您的逻辑放入正式表中,然后加入:
UPDATE t1
SET PostVal = CASE WHEN t1.PreVal < t2.PreVal
THEN t2.positive ELSE t2.negative END
FROM Table1 t1
INNER JOIN
(
SELECT 1 AS ID, 6 AS PreVal, 1 AS positive, 0 AS negative
UNION ALL
SELECT 2, 12, 1, 0
) t2
ON t1.ID = t2.ID
答案 1 :(得分:0)
你可以尝试类似的东西:
Boolean.FALSE
查询列允许您使用不同的逻辑。
答案 2 :(得分:0)
如果转换逻辑太复杂,如:
1 case when PreVal < 6 then 1 else 0 end
2 case when PreVal = 0 then 1 else 2 end
3 case when PreVal > 1000 then 0 else 1 end
4 case when PreVal = 1 then 1 else 2 end
然后我相信你无能为力。
在那种情况下,我会跑:
select distinct
'update table1 set PostVal = ' + b.Logic + ' where Id = ' + convert (varchar(10), a.id)
from
table1 a
inner join table2 b on ( a.id = b.id )
为每一行生成更新语句并按段运行。