0

私はこれらのテーブルを持っています:

「ユーザー」

id  email                name                 last_access
1   luca@gmail.com       Luca Pluto           2012-10-05 17:21:22.0
2   pippo@gmail.com      Irene Pippo          2012-10-05 17:22:25.0

「Nets_permissions」

user_id         network_id  perm
1               1234        3
1               1235        1
2               1235        3

私はこのクエリを書きました:

SELECT u.id, u.name, n.perm
FROM users as u LEFT OUTER JOIN nets_permissions as n
ON u.id = n.user_id
WHERE n.network_id=1234 AND n.perm <> 3

network_id (1234) のアクセス許可を既に持っているユーザーだけでなく、network_id のアクセス許可を持っていないユーザーも必要だからです。つまり、次の結果クエリがあります。

2    null    null

ネット1234のid = 1のユーザーLuca Plutoはperm = 3であるため、除外したい. 代わりに、id=2 のユーザー Irene Pippo には、1234 ネットに対する権限がありません。そのため、行には net_id と perm を null に設定する必要があります。

クエリ結果が空です。どうしてか分かりません。節 n.perm <> 3 がなければうまくいくようですが、perm=3 の rw だけでなく null 値も除外されます。

私もこの方法で試しました:

SELECT u.id, u.name, n.perm FROM users as u LEFT OUTER JOIN 
(select * from nets_permissions WHERE network_id=1234) as n on u.id = n.user_id 
WHERE n.perm <> 3

しかし、うまくいきません。WHERE 句がなくてもすべて機能します。いいえ。結果クエリは空です。

この問題を解決するにはどうすればよいですか? perm 列が値または null である必要があります。この列を削除できません。

4

4 に答える 4

1
SELECT u.id, u.name, n.perm
FROM 
    users as u 
    LEFT OUTER JOIN 
    nets_permissions as n ON u.id = n.user_id 
WHERE 
    n.network_id = 1234 and n.perm <> 3
    or
    n.network_id <> 1234
    or
    n.network_id is null
于 2012-10-06T11:52:34.760 に答える
1

多くの SQL ダイアレクトは、とNULLに加えて 3 番目に可能な値を持つ特別な 3 項ロジックを使用します。truefalse

として処理されるNULL結果と比較されるもの。NULLfalse

したがって、x = null結果はfalsefor allxになります。x != null

結果に値を含めたい場合NULLは、そのための特別な処理を追加する必要があります (Oracle 構文):

SELECT u.id, u.name, n.perm
FROM users as u LEFT OUTER JOIN nets_permissions as n
ON u.id = n.user_id
WHERE n.network_id=1234 
AND (n.perm <> 3 or n.perm is not null)
于 2012-10-06T11:43:01.067 に答える
1

「JOIN」構文を使用するユーザーが好きです。コードを読みやすくする以外にも、人々が気付いていない追加の利点があります。

SELECT u.id, u.name, n.perm
FROM users as u LEFT OUTER JOIN nets_permissions as n
ON u.id = n.user_id
AND n.network_id=1234 
WHERE COALESCE(n.perm,-1) <> 3
于 2012-10-06T16:06:30.227 に答える