SQL Server:子查询返回多于1个值

问题描述 投票:0回答:4

我有两个表一个包含的表

a b c d e f

和表二包含

b c d e f g h i j k l

我想显示表二中的数据,不应该在表一中使用数据(k l)这里应该打印值k and l

在我的例子中,我写了查询

select comarea from companyarea where comarea !=(select area from companyallot where comname='24' and zone='west' and location='mumbai')

但错误即将来临

消息512,级别16,状态1,行1子查询返回的值超过1。当子查询跟随=,!=,<,<=,>,> =或子查询用作表达式时,不允许这样做。

在我的例子中,我想使用名为companyallot的表中未使用的区域

sql-server subquery
4个回答
2
投票
In Where condition "=" operator will deal with single value, "in" operator will deal with multiple values. So instead of using != use "not in" operator as below.
SELECT comarea FROM companyarea 
     WHERE comarea NOT IN
     (SELECT area FROM companyallot WHERE comname='24' AND zone='west' AND      
     location='mumbai')

1
投票

!=算子替换NOT IN

SELECT COMAREA FROM COMPANYAREA WHERE COMAREA NOT IN  (
        SELECT AREA
        FROM COMPANYALLOT
        WHERE COMNAME = '24'
            AND ZONE = 'WEST'
            AND LOCATION = 'MUMBAI'
        )

0
投票

只要子查询没有返回NOT IN值,NULL运算符就可以正常工作,但只要子查询中有一个空值,它就会变成梨形。

更安全的选择是使用EXISTS/NOT EXISTS运算符,类似......

select a.comarea 
from companyarea a
where NOT EXISTS (select 1 
                 from companyallot t 
                 where t.comname='24' 
                   and t.zone='west' 
                   and t.location='mumbai'
                   and a.comarea = t.area)

0
投票

你需要做两件事才能让它发挥作用:

- >使用多值运算符NOT IN(OR)IN

- >虽然你的情况没有指定它,但是如果你通过在内部子查询结果中使用NVL来提高NULLS的效果总是好的。

- > NOT EXISTS操作员仍然可以工作

© www.soinside.com 2019 - 2024. All rights reserved.