我在Oracle中有以下查询:
SELECT serverHostName,
operatingSystem,
serverClass
FROM Server_Inventory A
WHERE A.serverHostName NOT IN
(SELECT rltd_ServerHostname
FROM App_Server_Relationship)
AND A.serverHostName NOT IN
(SELECT rltd_ServerHostname
FROM DataBase_Server_Relationship)
AND A.operatingSystem NOT IN ('OS1','OS3','OS5')
AND A.serverClass NOT IN ('CLASS_3','CLASS_6');
我试图从我的Server_Inventory表中获取没有链接或关联的应用程序和数据库的服务器列表。我确实得到了一些结果,但在一些手动验证之后,我注意到一些服务器正在被排除,尽管它们不属于排除条件。例如,假设我有一个名为"Server_24GW1“的服务器。如果我像这样执行查询:
SELECT serverHostName,
operatingSystem,
serverClass
FROM Server_Inventory A
WHERE A.serverHostName NOT IN
(SELECT rltd_ServerHostname
FROM App_Server_Relationship)
AND A.serverHostName NOT IN
(SELECT rltd_ServerHostname
FROM DataBase_Server_Relationship)
在查找Server_24GW1服务器时,我得到了以下结果:
serverHostName | operatingSystem | serverClass
----------------------------------------------------
Server_24GW1 | (null) | CLASS_10
但是如果我使用以下条件执行查询,则意味着:
AND A.operatingSystem NOT IN ('OS1','OS3','OS5')
AND A.serverClass NOT IN ('CLASS_3','CLASS_6');
当我尝试查找Server_24GW1时,我什么也得不到,即使operatingSystem
和serverClass
不属于排除条件。
有人知道我可能做错了什么吗?
发布于 2019-03-01 08:07:52
空值的工作方式与其他任何值都不同
尝尝这个。尽管它可能会停止在operatingSystem
上使用索引,但逻辑会按照您想要的方式工作。
AND NVL(A.operatingSystem,' ') NOT IN ('OS1','OS3','OS5')
或者这个
AND (A.operatingSystem NOT IN ('OS1','OS3','OS5') OR A.operatingSystem IS NULL)
https://stackoverflow.com/questions/54936094
复制相似问题