在下表中,我想删除或更新第二行(2,3,100,test2),当且仅当是会话的最后一行(100)。
例如,可以修改第三行,因为它是按session_id = 100分组的最后一行,但不应删除/更新第一行和第二行。
我怎么能有效率呢?
您可以在下面的架构中看到的ID列是一个自动生成的数字,它总是会增加。
您可以在下面找到我的架构:
CREATE TABLE "TEST_T"
(
"ID" NUMBER GENERATED ALWAYS AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE ,
"PARENT" NUMBER,
"SESSION_ID" NUMBER,
"DATA" VARCHAR2(2000 BYTE)
)
Insert into TEST_T (ID,PARENT,SESSION_ID,DATA) values (1,1,100,'test');
Insert into TEST_T (ID,PARENT,SESSION_ID,DATA) values (3,2,100,'test2');
Insert into TEST_T (ID,PARENT,SESSION_ID,DATA) values (4,33,100,'test3');
您可以使用以下命令删除行:
delete from test_t t
where t.session_id = 100 and
t.id = (select max(t2.id) from test_t t2 where t2.session_id = t.session_id);
类似的逻辑可以用于update
。
具有最大价值的父母是最后一个父母吗?如果是这样,您可以尝试使用以下代码
DELETE FROM test_t b
WHERE EXISTS (SELECT *
FROM (SELECT A.*, MAX(parent) KEEP (DENSE_RANK LAST ORDER BY parent) OVER (PARTITION BY session_id) last_parent
FROM TEST_T A) a
WHERE a.last_parent = b.parent
and a.session_id = b.session_id)
或者,您可以使用LAST_VALUE函数,下面的示例查询
SELECT A.*, last_value(parent) OVER (order by session_id) last_value
FROM TEST_T A
ORDER BY SESSION_ID, PARENT DESC