首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

不能干:“子查询用作表达式时”

2014-01-19 
不能作:“子查询用作表达式时”select id from BhBwhere Bh in (select bh from bhb where glid(select gli

不能作:“子查询用作表达式时”
select id from BhB 
  where Bh in (select bh from bhb where glid=(select glid from bhb where bh='10838318'))

这句是可以执行的,当放在case when中,

 select id from BhB where Bh in (
  case when(select glid from bhb where bh='10838318')=0
then (select bh from bhb where  bh='10838318') 
else (select bh from bhb where glid=(select glid from bhb where bh='10838318'))
 end)

就出现错误,“子查询返回的值不止一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。”

是不能作:“子查询用作表达式时”
该怎么解决?

请高手帮助

[解决办法]
分支呗
if
elseif
else

[解决办法]
子查询里面有大于1条的数据,要是取得的bh有不同的几条数据,就会报错;
如果是重复的,可以用一下方法改正:



 select id from BhB where Bh in (
  case when(select distinct glid from bhb where bh='10838318')=0
then (select distinct bh from bhb where  bh='10838318') 
else (select distinct bh from bhb where glid=(select distinct glid from bhb where bh='10838318'))
 end)


[解决办法]
glid=(select glid from bhb where bh='10838318')
这句的问题
当括号里的查询只返回一条记录时,不会报错。
当括号里的查询返回多条记录时,就会报你那个错,因为无法把一个值和多个值用等号比较。

处理方法要么是保证后面的查询只返回一条记录,如创建唯一索引,或者在确保查询语义正确的情况下把=改成in
[解决办法]
if (select glid from bhb where bh='10838318')=0 --如果返回多条会报错
  select id from BhB where Bh in (select bh from bhb where  bh='10838318') 
else
select id from BhB 
   where Bh in (select bh from bhb where glid=(select glid from bhb where bh='10838318'))
 
[解决办法]
case when 是表达式,而你那个是集合,所以报错
[解决办法]

--建议改用exists
select id from BhB t1
  where exists (select bh from bhb t2 where  t2.bh=t1.bh
and exists(select 1 from bhb b3 where t2.glid=t3.glid and bh='10838318'))

[解决办法]
因为你使用了子查询,而当子查询返回多于1个值的时候,就不能再用 = 号了,只能用in或者exists



热点排行