1

私はこのクエリを持っています:

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

結果は次のとおりです。

id  name    network_id  perm
1   Luca Niccolini  9124823324095   1
2   Irene Pippo 9124823324095   0
2   Irene Pippo 1234567812345678124 1

クエリの結果は次のようになります。

id  name    network_id  perm
1   Luca Niccolini  9124823324095   1
2   Irene Pippo 9124823324095   0

実際、一部のユーザーにネット上の許可を与えたいと思っています。このユーザーは、既にネット上で許可を持っている可能性がありますが、他のネットでも許可されています。したがって、この場合、ユーザー Luca はネット 9124823324095 での許可のみを持っていますが、ユーザー Irene は 2 つの異なるネットで 2 つの許可を持っています。ネット 9124823324095 のアクセス許可を付与したいので、3 番目のレコードは必要ありません。

しかし、ネット ID でフィルタリングすることはできません。他のネットでは許可されているが、自分のネットでは許可されていないユーザーがいる可能性があるためです。

つまり、クエリに 2 つ以上のレコードがあるユーザーの場合、ネットのレコードのみを取得できます。レコードを 1 つしか持っていないユーザーの場合、そのレコードを取得できます。

説明するのは難しいです。ご協力ありがとうございました!

4

1 に答える 1

0

次のコードは、SQL のほとんどの方言で機能します。

select id, name, network_id, perm
from (select t.*, count(*) over (partition by u.id) as NumRowsForUser
      from (SELECT  DISTINCT u.id, u.name, n.network_id, n.perm 
            FROM    users as u RIGHT OUTER JOIN 
                    nets_permissions as n ON u.id = n.user_id AND n.perm<> 3 
            WHERE   u.id!=3
           ) t
     ) t
where NumRowsForUser > 1 and network_id = '9124823324095' or
      NumRowsForUser = 1

ネットワーク上に複数のアクセス許可があり、ネットワーク用のアクセス許可がない場合を考えたことがありますか? これらはあなたの条件により除外されます。

于 2012-09-27T13:56:24.007 に答える