我有两个表一个包含的表
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操作员仍然可以工作