这个sql语句有什么问题?

sah*_*har 0 sql oracle11g

我写这个声明在所有情况下都能正常工作,除了一个案例

SELECT p.priv_no FROM osqs_privileges p,osqs_users_privileges up 
WHERE up.priv_no = p.priv_no AND up.user_no = 54 AND up."GRANT" = 'Y' 
    UNION 
SELECT p.priv_no FROM 
osqs_privileges p,osqs_groups_privileges gp,osqs_users_groups ug,osqs_users_privileges up 
    WHERE gp.priv_no = p.priv_no AND ug.grp_no = gp.grp_no AND ug.user_no = 54 
AND gp.priv_no NOT IN 
    (SELECT priv_no FROM osqs_users_privileges WHERE user_no = 54 AND "GRANT" = 'N');
Run Code Online (Sandbox Code Playgroud)

在osqs_users_privileges没有行的情况下,此语句(SELECT priv_no FROM osqs_users_privileges WHERE user_no = 54 AND"GRANT"='N')返回0行,即使其他语句返回数据,所有脚本也返回0行.为什么?

Mit*_*eat 5

这是由于NOT IN子句中NULL的行为.

例如,

select 'yes' where 3 in (1, 2, 3, null)  -- Return result
select 'yes' where 3 not in (1, 2, null) -- Returns an empty set
Run Code Online (Sandbox Code Playgroud)

为什么?因为3 <> null结果UNKNOWN.

条件无效

计算到UNKNOWN的条件几乎就像FALSE.例如,在WHERE子句中具有计算结果为UNKNOWN的条件的SELECT语句不返回任何行.但是,评估为UNKNOWN的条件与FALSE的不同之处在于UNKNOWN条件评估的进一步操作将评估为UNKNOWN.因此,NOT FALSE计算结果为TRUE,但NOT UNKNOWN计算结果为UNKNOWN.

参考.