Oracle,确定一行是该组中的最后一行

问题描述 投票:0回答:2

在下表中,我想删除或更新第二行(2,3,100,test2),当且仅当是会话的最后一行(100)。

例如,可以修改第三行,因为它是按session_id = 100分组的最后一行,但不应删除/更新第一行和第二行。

我怎么能有效率呢?

您可以在下面的架构中看到的ID列是一个自动生成的数字,它总是会增加。

enter image description here

您可以在下面找到我的架构:

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');
sql database oracle
2个回答
0
投票

您可以使用以下命令删除行:

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


0
投票

具有最大价值的父母是最后一个父母吗?如果是这样,您可以尝试使用以下代码

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
© www.soinside.com 2019 - 2024. All rights reserved.