如何将SELECT语句生成的奇偶判断结果更新至对应列?
解决EvenRodd表UPDATE语句的问题
嘿,我来帮你排查这个UPDATE语句的问题~你的代码里主要有两个小错误导致执行失败:
- 子查询返回了多余的列:你在SET的子查询里同时选了
evenrodd.nrow和CASE的结果,但e_and_o只需要CASE生成的'Odd'/'Even'值,多列返回会让数据库无法识别要赋值的内容。 - 子查询未关联当前更新行:这个子查询会返回整个表的所有行结果,数据库没法对应到当前正在更新的那一行,会触发「单行子查询返回多行」的错误。
正确的写法(最简洁高效版)
其实完全不需要嵌套子查询,直接把你SELECT语句里的CASE逻辑搬到UPDATE的SET里就行:
UPDATE evenrodd SET e_and_o = CASE WHEN MOD(nrow, 2) != 0 THEN 'Odd' WHEN MOD(nrow, 2) = 0 THEN 'Even' END WHERE e_and_o IS NULL;
关联子查询版(如果需要用子查询的情况)
要是你一定要用子查询实现,得给子查询加上关联条件,确保它只返回当前更新行的计算结果:
UPDATE evenrodd t1 SET e_and_o = ( SELECT CASE WHEN MOD(t2.nrow, 2) != 0 THEN 'Odd' WHEN MOD(t2.nrow, 2) = 0 THEN 'Even' END FROM evenrodd t2 WHERE t2.nrow = t1.nrow -- 关联当前要更新的行 ) WHERE e_and_o IS NULL;
第一种写法直接对每一行计算奇偶性结果,性能更好也更易读,推荐用这个~
内容的提问来源于stack exchange,提问作者Yash Vcb
相关产品推荐
相关产品推荐

