使用子查询返回的多行更新一列

时间:2013-07-23 13:26:05

标签: sql sql-server-2008 tsql

我已经找到了很多这方面的材料,但是我找不到任何特定的方案来帮助我解决问题并摆脱错误,

  

Msg 512,Level 16,State 1,Line 1
  子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

     

声明已经终止。

我遇到问题的存储过程部分如下。

set @strSql = 'update ' + @tableName 
+ ' set unique_subs_'+@FieldName + ' = (select isnull(COUNT(distinct  a.wr_unique_subs),0) 
from tbl_Cluster_Subs_revenue a, tbl_Cell_info b 
where a.wr_cell_id = b.CI group by b.Cluster_Name)'
exec(@strSql)

非常感谢一些指导。

2 个答案:

答案 0 :(得分:0)

尝试更改isnull函数的位置,如下所示:

set @strSql = 'update ' + @tableName 
+ ' set unique_subs_'+@FieldName + ' = isnull((select COUNT(distinct  a.wr_unique_subs)
from tbl_Cluster_Subs_revenue a, tbl_Cell_info b 
where a.wr_cell_id = b.CI group by b.Cluster_Name),0) '
exec(@strSql)

答案 1 :(得分:0)

有什么不清楚的?子查询返回多个值。你需要选择其中一个。我还建议使用标准join语法,而不是隐式连接到where子句。

您可以使用top 1

解决此问题
update ' + @tableName + '
    set unique_subs_'+@FieldName + ' = (select top 1 isnull(COUNT(distinct  a.wr_unique_subs),0) 
                                        from tbl_Cluster_Subs_revenue a join
                                             tbl_Cell_info b 
                                             on a.wr_cell_id = b.CI
                                        group by b.Cluster_Name
                                       );

(仅仅因为你将SQL放在一个字符串中并不意味着它必须格式化.SQL Server允许字符串中的行尾字符。)

但是,我猜你可能想要这样的东西:

update ' + @tableName + '
    set unique_subs_'+@FieldName + ' = (select COUNT(distinct  a.wr_unique_subs)
                                        from tbl_Cluster_Subs_revenue a join
                                             tbl_Cell_info b 
                                             on a.wr_cell_id = b.CI
                                         where Cluster_Name = ''' + @FieldName + '''
                                         )

您实际上并不需要isnull(),因为如果没有匹配的行,count()会返回0