27. oktober 2001 - 10:30Der er
17 kommentarer og 2 løsninger
select sidst ændrede række
Givet en tabel T med bl.a felterne id,Xid,datoopret og datoret, hvor id=teknisk id,xid er en fremmednøgle,datoopret er sysdate for det INSERT-statement der skabte rækken, men datoret er sysdate for det UPDATE-statement der evt sidst har ændret rækken. Jeg vil gerne selecte de sidst berørte rækker pr Xid, altså den række pr Xid, som er insert\'ed eller update\'d sidst.
Det er en eksisterende database, hvor der ikke kan tilføjes nye felter eller andet sjovt? Mvh Erik
Selvom mange ledere i danske virksomheder udviser stor interessere for kunstig intelligens (AI), tøver de med at tage teknologien i brug.
19. november 2024
Slettet bruger
27. oktober 2001 - 12:51#1
Det simpleste er vel
select XId from T where greatest(datoopret, datoret) = ( select max(greatest(datoopret, datoret)) from T )
Dette forhindrer formodentlig at man kan lave intelligent brug af indekser.
Hvis man vil have ændrede rækker indenfor de sidste dage kunne man skrive:
select Xid from T where greatest(datoopret, datoret) = ( select max(greatest(datoopret, datoret)) from T where greatest(datoopret, datoret) > (SYSDATE - :1) )
Hvor \':1\' er \'antal dage\'
Synes godt om
Slettet bruger
27. oktober 2001 - 12:56#2
Ups! Det sidste virker naturligvis ikke, det skulle have været:
\"Hvis man vil have ændrede rækker indenfor de sidste dage kunne man skrive:
select Xid from T where datoopret > (SYSDATE - :1) or datoret > (SYSDATE - :1)
Hvor \':1\' er \'antal dage\'
Synes godt om
Slettet bruger
27. oktober 2001 - 13:04#3
Hvis man har indekser på datoret og datoopret kan man hurtigere få Xid på den sidst ændrede række ved at skrive:
select * from ( select * from ( select Xid, datoopret dato from T where datoopret = (select max(datoopret) from T) union all select Xid, datoret dato from T where datoret = (select max(datoret) from T) ) order by dato ) where rownum < 2
Tak Joern_h Dit første eksempel med greatest virker næsten. Det tager ikke de rækker med hvor kun datoopret er udfyldt og datoret er null, altså de rækker som aldrig er blevet update\'et. Kan du få dem med er point\'ene dine :o) Mvh ERik
Hej teepee Tak for svaret, men dit eksempel select\'er kun på datopret, og jeg skal bruge de rækker pr xid hvor enten datoret eller datoopret er størst
Jeg tænkte det nok, men enten kan du oprette et view, det nvl\'er datoopret ind i datoret, hvor denne er null, eller også kan du lave en subselect som laver en slags runtime view. Så erstat T med viewet select id, xid, datoopret, nvl(datoret, datoopret) datoret from T. Så du\'r min første select
Hej Tak for hjælpen. Jeg kunne bruge noget af jer begge to\'s indlæg, så I får lov at dele, OK? Mvh ERik
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.