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
如果您想要
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
变量来包含输出。