我正在尝试写出一个查询,该查询将输出User不属于Role的所有情况。

我试图将查询限制为尽可能简单(无循环 )。

我的示例中的表结构是这样的:

  • Team

     ID | UserID | RoleID ---+--------+------- 1 | 0 | 0 2 | 0 | 1 3 | 0 | 2 4 | 1 | 0 5 | 1 | 2 
  • Roles

     RoleID | Name -------+----- 0 | AAA 1 | BBB 2 | CCC 3 | DDD 4 | EEE 

所需的输出:

UserID | RoleID
-------+-------
0      | 3
0      | 4
1      | 1
1      | 3
1      | 4

我当前使用的代码是:

SELECT *
FROM Team t
RIGHT OUTER JOIN Roles r ON t.RoleID = r.RoleID
LEFT JOIN Roles r1 ON t.RoleID = r1.RoleID
WHERE r.RoleID IS NULL

#1楼 票数:0

您可以使CROSS JOIN团队和角色生成所有可能的组合,然后使用LEFT JOIN反模式找出不存在的组合:

SELECT DISTINCT t.UserID, r.RoleID
FROM Team t
CROSS JOIN Roles r
LEFT JOIN Team t1 ON t1.RoleID = r.RoleID AND t1.userID = t.UserID
WHERE t1.UserID IS NULL
ORDER BY t.UserID, r.RoleID

DB Fiddle上的演示与示例数据一起返回:

| UserID | RoleID |
| ------ | ------ |
| 0      | 3      |
| 0      | 4      |
| 1      | 1      |
| 1      | 3      |
| 1      | 4      |

#2楼 票数:0

我主张使用cross join联接生成行,然后过滤掉已经存在的行(使用left joinnot in ):

select u.userid, r.roleid
from (select distinct userid from team) u cross join
     roles r left join
     team t
     on t.userid = u.userid and t.role_id = r.roleid
where t.userid is null;

如果您有单独的用户表,则可以使用该表代替子查询。 相对于在外部查询中使用select distinct / group by的方法,这应该具有两个优点:

  • 索引可用于u(select distinct)子查询。
  • 无需对完整结果集进行处理即可删除重复项。

  ask by Travis O'Donnell translate from so

未解决问题?本站智能推荐:

2回复

SQL完全外部联接排除,选择不存在的行

我有3张桌子: 查询如下: 表数据为: 查询将返回 现在,如果我将以下排除权限添加到组合中: 查询将返回: 如您所见,主持人部分仍然存在,因为它还有另一行与之关联。 但是,管理员部分已删除,因为它所关联的唯一权限已被排除。 我想做的是让我的查询
1回复

使用外部联接的SQL查询?

我有以下关系: 我想列出2014年6月之前加入公司但在2014年6月没有通过某种形式的外部加入获得佣金的所有员工。 我想出了这个查询,但它不起作用。 有人可以告诉我如何查询吗?
1回复

将表与表1中的所有元组联接在一起,但表2中只有1个匹配的元组

我有两个要加入MySQL的表。 第一个是目录项目表-每个项目都有一个item_id字段。 我还有一张与项目(item_id,image_id,内容)相关的图像表。 如何连接这两个表,以便获得所有项目的列表,而且还包含来自图像表的该项目的一个元组? 我希望能够生成所有项目的列表以及
3回复

SQL从(+)=查询转换为左外部联接

转换前查询 转换后查询 对于为何“查询后”转换为什么不返回与之前查询相同的结果,我似乎有些犹豫。 我知道我在这里错过了一些愚蠢的东西,谁能发现明显的东西?
1回复

从具有联接表的两个表中获取数据

我很抱歉我问这个。 林不知道为什么我不能得到它。 我想我还是很新。 我有三张桌子: 我的查询是: 我获得了项目名称的值,即使联接表上存在关系,我也没有获得location_name的值。 我本以为这会根据关系返回两个值
1回复

SQL左外部联接

所以我有一张表,里面有员工编号(empno) , name(ename)和manager number(mgr) 。 问题:列出所有雇员的姓名,以及其经理的姓名和其经理的经理的姓名,如果不存在经理,则在左边留一个空白。 到目前为止,我有: SELECT a.ename, b.enam
1回复

无法获取SQL条件-左外部联接

下面,我有一个SQL select语句,但是与其中一种条件有关,我遇到了一些问题。 我还有另一种方式可以安排此语句,以便确定条件吗? 条件没有被提取: 完整说明:
1回复

如何优化这个极其缓慢的左外部联接sqlite查询?

我遇到了一个SQL查询问题,该问题基本上很慢,大约需要17分钟以上的时间。 我敢肯定,这完全是由于外部联接和纯数据量使此查询变得很糟糕。 不幸的是,我没有看到一种很好的方法来重写它以获得我想要的东西 我有下表(为简洁起见,省略了一些列): 事件表大约有25,000行( 实际数据