根据条件删除行,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'
);
我有一个 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'
);