我有两张桌子:PROD和CUST 在SQL和SYBASE中运行以下查询时,它可以正常工作。 甲骨文没有给出任何结果。
select * FROM PROD
where PROD.SECID NOT IN (SELECT CUST.SECID FROM CUST WHERE SECID <> '')
注意: PROD.SECID具有所有空值。 CUST.SECID具有所有非空值(有效值)。
<>''
没有从内部子查询中获取任何记录,因此我将其更改为IS NOT NULL,现在它将获取结果。
但问题是,当查询作为一个整体运行时,它不会给出任何结果,而它应该。
答案 0 :(得分:4)
NOT IN按预期工作。如果你有空值,你不能说它是'在'给定的集合或否。
SQL> select case
2 when null in (1, 2, 3) then 'in'
3 when null not in (1, 2, 3) then 'not in'
4 else 'null'
5 end as result
6 from dual;
RESULT
------
null
如果您希望排除给定值,则应使用not exists
,或者更好地使用反加入:
select p.*
from prod p, cust c
where p.secid = c.secid (+)
and c.secid is null;
答案 1 :(得分:1)
试试这个:
select PROD.* FROM PROD LEFT JOIN CUST
ON PROD.SECID = CUST.SECID
答案 2 :(得分:1)
我注意到了两件事:
1)如果列表中至少有一个NULL值,则返回FALSE。因此,如果子查询返回NULL,则整个查询将返回0行。
2)子查询中存在无效过滤器:
WHERE SECID <> ''
此子句将返回0行以及&#39;&#39;与NULL相同,任何与NULL的比较(除了IS NULL / IS NOT NULL)都返回FALSE。请将其改写如下:
WHERE SECID IS NOT NULL