You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:48:00