sql - SQL Query 连接到第二个表中看似循环不存在的匹配项
问题描述
我正在尝试编写一个查询,该查询将输出用户不属于角色的所有情况。
我试图将此查询限制为尽可能简单(无循环等)。
我的示例中的表结构如下:
表
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
解决方案
您可以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 |
推荐阅读
- javascript - JS非阻塞打印
- javascript - 如何检查一个单词在 JSON 数组中出现的次数
- reactjs - 如何使用 React Hooks 在第一次渲染时加载带有道具的子组件
- javascript - ag-grid:使整行成为行拖动的夹点
- python - 如何使用输入框设置变量
- haskell - 我可以概括 Haskell 中的类约束吗?
- graphql - 如何修复“错误:GraphQL 错误:无法读取未定义的属性 'id'”?
- splunk - 根据其他字段的值计算一个字段的值
- c++ - 具有多线程支持的 RenderClass,将函数调用推送到向量以在另一个线程上调用
- swift - Swift SQLite 查询不返回任何结果