在Oracle中,如何删除具有特定值的行(仅当它重复时)?

问题描述 投票:0回答:1
Create Table testpo
( 
    poid Varchar2(10),
    ToDelete Varchar2(10)
);

Insert into testpo values (‘PO1’, ‘D’);
Insert into testpo values (‘PO1’, ‘N’);
Insert into testpo values (‘PO2’, ‘D’);
Insert into testpo values (‘PO3’, ‘D’);

我想创建一个存储过程来返回唯一的 POId,但如果同一 POid 有 D 和 N,我只需要 IsDelete = N 的行

需要输出:

PO1 N
PO2 D
PO3 D
sql oracle plsql
1个回答
1
投票

如果您想要

SELECT
独特的
poid
优先考虑
ToDelete
N
值,那么您可以使用:

SELECT poid,
       ToDelete
FROM   (
  SELECT poid,
         todelete,
         ROW_NUMBER() OVER (PARTITION BY poid ORDER BY ToDelete DESC) AS rn
  FROM   testpo
)
WHERE  rn = 1

如果您想要

DELETE
非唯一行(同样,优先保留
ToDelete
N
值),那么您可以使用:

DELETE FROM testpo
WHERE ROWID IN (
  SELECT ROWID
  FROM   (
    SELECT ROW_NUMBER() OVER (PARTITION BY poid ORDER BY ToDelete DESC) AS rn
    FROM   testpo
  )
  WHERE  rn > 1
)

SELECT
的输出和
DELETE
之后剩余的行是:

POID 删除
PO1 N
PO2 D
PO3 D

如果您希望将其作为过程,请将其包装在

CREATE PROCEDURE
语句中并返回
SYS_REFCURSOR
变量来包含输出。

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.