查询的左外连接或右外连接

时间:2012-09-26 16:08:44

标签: left-join distinct

我有这个问题:

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在两个不同的网络上拥有两个权限。我想在网络9124823324095上授予权限,所以我不想要第三条记录。

但我无法使用网络ID进行过滤,因为我可以让用户拥有其他网络的权限,但不能在我的网络上。

换句话说,我会那样做 - 对于在查询中有两个或更多记录的用户,我只能记录我的网络记录 - 对于只有记录的用户,我可以记录该记录。

很难解释。谢谢你的帮助!

1 个答案:

答案 0 :(得分: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

您是否考虑过网络上有多项权限但没有一种适用于您的网络的情况?这些不包括在您的条件中。