如何从两查询UNION结果取TOP1赋值变量?解决报错且无需临时表
解决从UNION结果取TOP1赋值变量的问题
嘿,这个错误我太熟悉了!你遇到的“Subquery returned more than 1 value”问题,根源是你把TOP 1的位置放错了——你原来的写法里,括号内的UNION子查询会返回所有匹配的行,哪怕外面加了TOP 1,赋值操作还是会因为子查询返回多行而报错。
当然可以直接实现这个赋值操作,而且完全不需要创建临时表,用派生表就能搞定,下面给你两种可行的写法:
写法一:直接SELECT赋值
DECLARE @a VARCHAR(3); SELECT TOP 1 @a = sifval FROM ( -- 合并两个表的查询结果,UNION会自动去重,需要保留重复的话用UNION ALL SELECT sifval FROM VALUTI WHERE OZNVAL = 'EUR' UNION SELECT sifval FROM KURSNA WHERE OZNVAL = 'EUR' ) AS CombinedResults;
写法二:用SET赋值
如果你习惯用SET来给变量赋值,也可以这样写:
DECLARE @a VARCHAR(3); SET @a = ( SELECT TOP 1 sifval FROM ( SELECT sifval FROM VALUTI WHERE OZNVAL = 'EUR' UNION SELECT sifval FROM KURSNA WHERE OZNVAL = 'EUR' ) AS CombinedResults );
关键说明:
- 两种写法都是先通过派生表
CombinedResults把两个表的结果合并,再从合并后的集合里取第一行赋值给@a,这样就确保了子查询只返回单个值,不会触发报错。 - 如果两个表中可能存在相同的
sifval值,UNION会自动去重;要是你需要保留所有匹配行(包括重复),把UNION换成UNION ALL就行,效率还更高。 - 派生表是内存中临时生成的结果集,不需要创建物理临时表,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user8675722
相关产品推荐
相关产品推荐

