SQL:SQL异或

SQL:SQL异或,sql,oracle,xor,Sql,Oracle,Xor,我有一张表格,格式如下: username | role ---------+------ name1 | internal name1 | admin name2 | internal name3 | admin name4 | external 我需要找到所有具有“internal”或“admin”角色但不同时具有这两个角色(本质上是XOR)的用户。如何在SQL中实现这一点 如果查询的结果类似于下面的表单,则该查询将是完美的: username | inter

我有一张表格,格式如下:

username | role
---------+------
name1    | internal
name1    | admin
name2    | internal
name3    | admin
name4    | external
我需要找到所有具有“internal”或“admin”角色但不同时具有这两个角色(本质上是XOR)的用户。如何在SQL中实现这一点

如果查询的结果类似于下面的表单,则该查询将是完美的:

username | internal | admin
---------+----------+-------
name2    | 1        | 0
name3    | 0        | 1
如果有帮助,我正在使用Oracle数据库

试试这个

SELECT UserName, 
CASE WHEN Role = 'internal' Then 1 Else 0 END internal,
CASE WHEN Role = 'admin' Then 1 Else 0 END admin
FROM (
SELECT A.*, COUNT(DISTINCT Role) OVER (PARTITION BY UserName) CNT
FROM Users A
) WHERE CNT = 1

我将通过条件聚合来实现这一点:

select username,
       max(case when role = 'internal' then 1 else 0 end) as internal,
       max(case when role = 'admin' then 1 else 0 end) as admin
from t
where role in ('internal', 'admin')
group by username
having count(*) = 1;

如果可以复制名称/角色对,则使用
拥有计数(不同角色)=1

一个非常简单的解决方案是计算用户拥有多少个角色,然后使用
拥有
仅过滤恰好拥有一个角色的角色。