SQL Server:子查询返回的值超过1

时间:2016-12-01 11:01:30

标签: sql-server subquery

我有两张桌子 表一包含

  

a b c d e f

和表二包含

  

b c d e f g h i j k l

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

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

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

但错误即将到来

  

Msg 512,Level 16,State 1,Line 1   子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

在我的示例中,我想使用名为companyallot

的表中未使用的区域

4 个答案:

答案 0 :(得分:2)

在Where where" ="运营商将处理单一价值,"在"运算符将处理多个值。所以不要使用!= use"而不是"运算符如下。
SELECT comarea FROM companyarea 
     WHERE comarea NOT IN
     (SELECT area FROM companyallot WHERE comname='24' AND zone='west' AND      
     location='mumbai')

答案 1 :(得分:1)

!=替换为NOT IN运算符

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

答案 2 :(得分: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)

答案 3 :(得分:0)

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

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

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

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