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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server:子查询返回多于1个值相关的知识,希望对你有一定的参考价值。

我有两个表一个包含的表

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的表中未使用的区域

答案
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')
另一答案

!=算子替换NOT IN

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

只要子查询没有返回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)
另一答案

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

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

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

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

以上是关于SQL Server:子查询返回多于1个值的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 子查询返回超过 1 个值。子查询遵循 =, !=, <, <= , >, >=

SQL查询时错误:子查询返回的值多于一个

返回多于一列的 SQL 子查询

Oracle SQL:ORA-01427:单行子查询返回多于一行

子查询在 sqlc# 中返回超过 1 个值

mysql n:m 关系删除查询 1242 子查询返回多于 1 行