根据条件删除行,SQL Oracle

Removing Rows based on Condition, SQL Oracle

我有一个 table,它存储一个 EVENT_NUMBER 及其 EVENT_TYPE_CODE(s)。类似于:

EVENT_NUMBER EVENT_ITEM_CODE
400001 M
400002 M
400002 S
400003 T
400004 L
400004 S
400004 M
400005 L
400005 T
400006 S
400006 M
400006 L
400006 T

数据从表单填充到 table。对于每个事件,用户将从项目列表中进行选择。当数据填充到 table 时,它在一行中被规范化。因此,例如,对于事件 400001,用户输入了一种代码 (M)。当用户输入事件 400002 的数据时,他们选择了 M 和 S。

我想查询这个 table,这样如果事件中曾经输入过 M,我想从结果中删除事件编号。例如,我们将完全删除事件 #400004 的所有行,因为至少有一行甚至有 'M'.

我一直在努力解决这个问题,很可能在这个阶段想得太多了。我尝试了一些方法,比如通过 LISTAGG 编译列表,然后在列表中搜索 'M',然后删除该行,但是,鉴于我的查询较大,我觉得这不是一种足够有效的方法正在创建。

我很感激任何建议。

您可以在此处使用具有现有逻辑的删除:

DELETE
FROM events e1
WHERE EXISTS (
    SELECT 1
    FROM events e2
    WHERE e2.EVENT_NUMBER = e1.EVENT_NUMBER AND
          e2.EVENT_ITEM_CODE = 'M'
);

编辑:如果你想查看你的table,请使用:

SELECT e1.*
FROM events e1
WHERE NOT EXISTS (
    SELECT 1
    FROM events e2
    WHERE e2.EVENT_NUMBER = e1.EVENT_NUMBER AND
          e2.EVENT_ITEM_CODE = 'M'
);