Oracle数据库查询需求:获取未对工单执行操作的组列表
Oracle数据库查询需求:获取未对工单执行操作的组列表
嘿,我来帮你搞定这个查询问题!你的需求是要列出每个工单对应的、从未对该工单执行过操作的所有组对吧?核心思路其实是先拿到所有工单和所有组的可能组合,然后排除掉那些已经在actions表中存在的(也就是该组对该工单有操作记录的)组合,剩下的就是你要的结果了。
这里给你两种可行的实现方式,都是Oracle支持的:
方法一:使用NOT EXISTS子查询
这种方式逻辑比较直观,先生成所有工单和组的全组合,再通过子查询过滤掉已有操作的组合:
SELECT t.ticket_id AS Ticket, g.group_name AS "Group" FROM tickets t CROSS JOIN groups g WHERE NOT EXISTS ( SELECT 1 FROM actions a WHERE a.ticket_id = t.ticket_id AND a.group_id = g.group_id ) ORDER BY t.ticket_id, g.group_name;
代码解释:
CROSS JOIN会把tickets里的每一条工单记录和groups里的每一个组记录进行配对,生成所有可能的工单-组组合;NOT EXISTS子查询会检查当前的工单-组组合是否在actions表中有对应的操作记录,如果没有(也就是该组没对这个工单做过操作),就保留这条记录;- 最后按工单ID和组名排序,让结果更规整。
方法二:使用LEFT JOIN + 空值筛选
这种方式用左连接来实现,逻辑和上面类似,只是写法不同:
SELECT t.ticket_id AS Ticket, g.group_name AS "Group" FROM tickets t CROSS JOIN groups g LEFT JOIN actions a ON a.ticket_id = t.ticket_id AND a.group_id = g.group_id WHERE a.ticket_id IS NULL ORDER BY t.ticket_id, g.group_name;
代码解释:
- 同样先通过
CROSS JOIN生成所有工单-组组合; - 然后左连接
actions表,匹配条件是工单ID和组ID都对应; - 对于那些没有操作记录的工单-组组合,左连接后
actions表的字段会是NULL,所以我们通过WHERE a.ticket_id IS NULL筛选出这些记录即可。
关于你之前的尝试
你之前试过从组到操作、操作到组的左连接,但没得到想要的结果,问题出在没有先生成所有工单和组的全组合——单独的左连接只能基于已有关联的记录扩展,没法覆盖所有可能的工单-组配对,所以才会离预期结果差得远。
备注:内容来源于stack exchange,提问作者RyanL83
相关产品推荐
相关产品推荐

