基于条件将两个查询结果写入临时表的SQL问题求助
解决建议:根据条件将不同查询结果写入临时表
首先看你提供的SQL代码有截断(最后是a...),而且核心问题是用CASE语句来返回多行子查询的结果是行不通的——CASE是用于返回单个标量值的,如果你子查询返回多行,会直接抛出"子查询返回的值不止一个"的错误,而且这种写法也不符合SQL的逻辑,因为你是要根据条件执行不同的查询来填充临时表,不是在列里做条件判断。
正确的做法是用IF...ELSE分支来分别处理两种情况,具体修正后的代码如下:
DECLARE @promptflag varchar(1) = 'N'; DECLARE @pool varchar(10) = 'PJMRTO'; -- 先清理临时表(如果存在) IF Object_id('tempdb..#pnode') IS NOT NULL DROP TABLE #pnode; -- 根据@promptflag的值执行不同的查询来创建/填充临时表 IF @promptflag = 'Y' BEGIN SELECT DISTINCT YES_PNODE INTO #pnode FROM PRICE_NODES WHERE ISO = @pool AND Biddable = 'Y'; END ELSE BEGIN -- 这里补全你原来截断的查询逻辑,比如假设你原本是另一个过滤条件 SELECT DISTINCT YES_PNODE INTO #pnode FROM PRICE_NODES WHERE ISO = @pool AND Biddable = 'Y' -- 这里加上你原来没写完的条件,比如 AND some_condition = ...; END
如果你的临时表需要固定结构(比如要提前定义列类型),也可以先创建表结构,再用INSERT INTO来填充:
DECLARE @promptflag varchar(1) = 'N'; DECLARE @pool varchar(10) = 'PJMRTO'; -- 先清理临时表(如果存在) IF Object_id('tempdb..#pnode') IS NOT NULL DROP TABLE #pnode; -- 提前创建临时表结构,替换成实际的数据类型 CREATE TABLE #pnode (YES_PNODE varchar(50)); -- 根据条件插入数据 IF @promptflag = 'Y' BEGIN INSERT INTO #pnode (YES_PNODE) SELECT DISTINCT YES_PNODE FROM PRICE_NODES WHERE ISO = @pool AND Biddable = 'Y'; END ELSE BEGIN INSERT INTO #pnode (YES_PNODE) SELECT DISTINCT YES_PNODE FROM PRICE_NODES WHERE ISO = @pool AND Biddable = 'Y' -- 补全你的条件 END
为什么原来的写法不行?
CASE表达式是行级/列级的条件判断,它只能返回一个单一值(比如某一行的某个列根据条件取不同的值),而不能返回一个完整的结果集。- 如果你的子查询返回多行,SQL Server会直接报错:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
另外,你原来的代码最后有个a...,记得把缺失的查询条件补全到ELSE分支的语句里哦。
内容的提问来源于stack exchange,提问作者Shyama Sonti
相关产品推荐
相关产品推荐

