2011-07-24 6 views
0

私は(user_no = 54 AND「GRANT」=「N」osqs_users_privileges FROM priv_noを選択1ケースosqs_users_privilegesが行と、この文を持っていない場合のこのSQL文の問題点は何ですか?

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'); 

を除くすべての場合に正しく動作します。この文を書きます)は0行を返し、select文がデータを返す場合でもすべてのスクリプトは0行を返します。どうして?

答えて

1

あなたが外部結合を使用する必要があります。

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 
LEFT JOIN osqs_groups_privileges gp on osqs_users_groups ug on gp.priv_no = p.priv_no 
LEFT JOIN osqs_users_privileges up on ug.grp_no = gp.grp_no 
WHERE ug.user_no = 54 
AND gp.priv_no NOT IN 
    (SELECT priv_no FROM osqs_users_privileges WHERE user_no = 54 AND "GRANT" = 'N'); 
+0

,, それがエラーを与える:この行の無効な関係演算子 LEFTはosqs_groups_privilegesのGPを登録しようosqs_users_groups ug on gp.priv_no = p.priv_no – sahar

+0

ありがとう、あなたは私に道を与えます。 あなたの答えが変更されました – sahar

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 

なぜ? 3 <> nullUNKNOWNになります。

Nulls in Conditions

A condition that evaluates to UNKNOWN acts almost like FALSE. For example, a SELECT statement with a condition in the WHERE clause that evaluates to UNKNOWN returns no rows. However, a condition evaluating to UNKNOWN differs from FALSE in that further operations on an UNKNOWN condition evaluation will evaluate to UNKNOWN. Thus, NOT FALSE evaluates to TRUE, but NOT UNKNOWN evaluates to UNKNOWN.

Ref

0

これは正しいコマンドです:

SELECT p.priv_no FROM osqs_privileges p,osqs_users_privileges up 
WHERE up.priv_no = p.priv_no AND up.user_no = 55 AND up."GRANT" = 'Y' 
    UNION 
SELECT p.priv_no 
FROM osqs_privileges p 
LEFT JOIN osqs_groups_privileges gp on gp.priv_no = p.priv_no 
LEFT JOIN osqs_users_groups ug on ug.grp_no = gp.grp_no 
LEFT JOIN osqs_users_privileges up on up.priv_no = p.priv_no 
WHERE ug.user_no = 55 
AND gp.priv_no NOT IN 
    (SELECT priv_no FROM osqs_users_privileges WHERE user_no = 55 AND "GRANT" = 'N') ; 
関連する問題