【发布时间】:2016-01-06 15:11:58
【问题描述】:
我有下面的查询给我这个错误:
消息 512,第 16 级,状态 1,第 5 行
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
我从 WHERE 子句中的子查询中得到错误。
当您看到“5,137”时,这将是一个变量来代替它。
Select val FROM DB01.dbo.f_split('5,137',',') 将返回分隔值列表作为结果。
我尝试的另一件事是将('5','137') 代替(Select val FROM DB01.dbo.f_split('5,137',',')),但在5 到137 之间的逗号上出现错误。
有什么想法吗?非常感谢所有帮助。
select
@Total_Orders = sum(a11.ORDER_CNT)
from
a11
join
a12 on (a11.STORE_ID = a12.STORE_ID)
join
a13 on (a12.CLIENT_ID = a13.CLIENT_ID)
join
a14 on (a11.ACTIV_DATE_ID = a14.DATE_ID)
join
a15 on (a13.PARENT_ID = a15.PARENT_ID)
where
a15.PARENT_DESC = 'Vanilla'
AND a13.CLIENT_ID IN
(
CASE WHEN '5,137'<>'All'
THEN (Select val FROM DB01.dbo.f_split('5,137',','))
ELSE (a13.CLIENT_ID)
END
)
AND a14.DATE between CONVERT(char(10), '2015-12-27T00:00:00-05:00',126) and CONVERT(char(10), '2016-01-02T23:59:59-05:00',126)
group by a13.PARENT_ID
【问题讨论】:
-
这里有很多问题。查看 case 表达式的第一个条件。字符串文字 '5,137' 永远不会等于字符串文字 'All' 所以它不可能到达任何其他分支。然后你有一个拆分函数,它可能会返回多行。这永远不会像你编码的那样工作。它会使用哪个值?为什么要提供硬编码字符串文字并转换为 varchar,然后将其隐式转换为 a14.DATE 的数据类型(我当然希望这是日期数据类型而不是 varchar)。
-
他提到字符串正在替换一个变量。我猜在某些情况下变量将等于“全部”
-
CASE在 T-SQL 中是一个 表达式(如a+b),它只能返回 一个原子值 - 你不能使用它有条件地执行整个代码块,也不能从中返回结果集
标签: sql sql-server