2016-12-01 127 views
0

更然后1个值i有两个表 表一个含有子查询返回在SQL

ABCDEF

和表中的两个包含

bcdefghijkl

我想要显示数据来源米表2和数据不应在表中的一个(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,行 子查询返回多个值。当子查询遵循=,!=,<,< =,>,> =或当子查询用作表达式时,这是不允许的。

在我的例子我想使用未在叫companyallot

回答

3
在条件“=”运营商将处理单个值表正在使用“在”运营商将处理区多个值。因此,不要使用!=使用“不在”运营商如下。
SELECT comarea FROM companyarea 
    WHERE comarea NOT IN 
    (SELECT area FROM companyallot WHERE comname='24' AND zone='west' AND  
    location='mumbai') 
2

NOT IN操作

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

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) 
1

你需要做两件事情,以使其工作:

- >使用多值运营商NOT IN(OR)的

- >虽然你的情况下,不指定,但它始终是好的,如果你在先进治疗NULLS很好,在你内心的子查询结果使用NVL。

- > NOT EXISTS运营商仍应该工作