日期:2014-05-17  浏览次数:20528 次

sql语法
UPDATE a SET a.ndhsl=CASE 
WHEN a.ndhsl>a.ntpbzl and  a.ntpbzl>b.sl-a.ndhsl+(a.ndhsl%a.ntpbzl)
 THEN (SELECT b.sl FROM #15 b WHERE a.sspbh=b.sspbh) 
WHEN ndhsl>ntpbzl AND ntpbzl<b.sl-ndhsl+(a.ndhsl%a.ntpbzl)
THEN (CONVERT(int,ndhsl/ntpbzl)*a.ntpbzl+a.ntpbzl)
WHEN ndhsl<ntpbzl AND ntpbzl>b.sl
THEN (SELECT a.sl FROM #15 a WHERE a.sspbh=sspbh)
WHEN ndhsl<ntpbzl AND ntpbzl<b.sl
THEN ntpbzl END FROM #12 a,#15 b
 WHERE a.px=1 AND a.sspbh=b.sspbh


报错消息 512,级别 16,状态 1,第 1 行
子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。

请问怎么改?
------解决方案--------------------
UPDATE a SET a.ndhsl=CASE WHEN a.ndhsl>a.ntpbzl and  a.ntpbzl>b.sl-a.ndhsl+(a.ndhsl%a.ntpbzl) THEN (SELECT top 1 b.sl FROM #15 b WHERE a.sspbh=b.sspbh) WHEN ndhsl>ntpbzl AND ntpbzl<b.sl-ndhsl+(a.ndhsl%a.ntpbzl)THEN (CONVERT(int,ndhsl/ntpbzl)*a.ntpbzl+a.ntpbzl)WHEN ndhsl<ntpbzl AND ntpbzl>b.slTHEN (SELECT top 1 a.sl FROM #15 a WHERE a.sspbh=sspbh)WHEN ndhsl<ntpbzl AND ntpbzl<b.slTHEN ntpbzl END FROM #12 a,#15 b WHERE a.px=1 AND a.sspbh=b.sspbh
------解决方案--------------------
既然语句中有的返回多行,说明两个问题
第一:你的语句是不对的,你对你要更新的数据条数不是百分百掌控.
第二:要解决的话,先从逻辑开始.如果觉得多条返回不影响数据的话.那么你可以使用 top 1 ,max,sum之类的聚合.