【问题标题】:Update one column with multiple rows returned from sub query用子查询返回的多行更新一列
【发布时间】:2013-07-23 13:26:05
【问题描述】:
我在这方面找到了很多材料,但我找不到任何特定于我的场景的东西来帮助我解决我的问题并摆脱错误,
消息 512,第 16 级,状态 1,第 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)
希望得到一些指导。
【问题讨论】:
标签:
sql
sql-server-2008
tsql
【解决方案1】:
什么不清楚?子查询返回多个值。您需要选择其中之一。我还建议使用标准的 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。
【解决方案2】:
尝试改变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)