我有这个问题:
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进行过滤,因为我可以让用户拥有其他网络的权限,但不能在我的网络上。
换句话说,我会那样做 - 对于在查询中有两个或更多记录的用户,我只能记录我的网络记录 - 对于只有记录的用户,我可以记录该记录。
很难解释。谢谢你的帮助!
答案 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
您是否考虑过网络上有多项权限但没有一种适用于您的网络的情况?这些不包括在您的条件中。