Avatar billede conrad Nybegynder
26. oktober 2006 - 19:32 Der er 7 kommentarer og
1 løsning

scope og nested loop

Update MyTable MyTable
    Set (field1) =
(Select * From
(Select x.field From X x, Y y
Where x.somefield=77
And y.key=mytable.key) <- problem ?
Where rownum < 2)

Er der nogen som kan se om denne kode er ok? Jeg har en kollega som siger at mytable er ude af scope i den nestede join, men jeg synes mine test ser ok ud

PS: ved godt at den ydre select måske kunne spares men det er ikke det der er spørgsmålet her - der skal formentlig en Order by på den inderste Select

Min kollega siger koden skal se således ud:
Update MyTable MyTable
    Set (field1) =

(Select x.field From X x, Y y
Where x.somefield=77
And y.key=mytable.key
AND rownum < 2)

hvilket pt også giver korrekt resultat
Avatar billede hgc Nybegynder
26. oktober 2006 - 20:53 #1
Umiddelbart kan jeg ikke se du kan løse det i eet update-statment.
Det øverste statement giver som din kollega siger "ugyldig identikator" fordi den ikke kender mytable i den inderste where-clause.
Den nederste giver ganske vist det rigtige resultat, men hvis der er flere rækker - og det er der vel siden du skriver rownum<2 - har du ikke styr på hvilken række den bruger til opdatering. Du kan heller ikke bruge en order by på samme niveau som rownum for den bruger rownum-kriteriet før order by.
En sidste bemærkning er, at du får opdateret alle rækker i mytable, dvs. field1 bliver null hvis ikke din subselect returnerer noget, men det er måske blot for overskuelighedens skyld at du ikke har en where-clause på selve update'en.
vh Henning
Avatar billede conrad Nybegynder
26. oktober 2006 - 21:14 #2
Først tak fordi du gider kigge på det Henning.
>>En sidste bemærkning er, at du får opdateret alle rækker i mytable, dvs. field1 bliver null hvis ikke din subselect returnerer noget, men det er måske blot for overskuelighedens skyld at du ikke har en where-clause på selve update'en. JA det er det.

>>Den nederste giver ganske vist det rigtige resultat, men hvis der er flere rækker - og det er der vel siden du skriver rownum<2 - har du ikke styr på hvilken række den bruger til opdatering. >>Dette er ok i den her case

Når jeg kører ovenstående så får jeg ikke nogen fejl (på 10g)hvilket undrer mig, da flere fortæller mig at koden er gal? Har du nogen forslag til om det kan være noget med versionen, eller noget andet der gør at det virker?
Avatar billede hgc Nybegynder
27. oktober 2006 - 07:10 #3
Jeg har prøvet det på 9i. Den øverste fejler, som nævnt, men den nederste skulle der ikke være noget galt med, det er den syntax jeg "plejer" at bruge. Hvad mener de der er galt med koden ?
Avatar billede conrad Nybegynder
27. oktober 2006 - 09:07 #4
Den øverste giver en ORA 00904 fejl som du selv er inde på, bare ikke når jeg kører den.
Avatar billede hgc Nybegynder
27. oktober 2006 - 09:44 #5
Jeg er vist ikke helt med. Hvornår giver den ORA 00904 og hvornår gør den ikke ?
Giver den ORA-fejl i f.eks sqlplus/toad men ikke i den applikation, eller hvordan ?
Avatar billede conrad Nybegynder
27. oktober 2006 - 11:27 #6
Den øverste kode giver ikke fejl når jeg kører den i Oracle SQL Developer, men hos en kunde giver den fejl. Begge er 10g.

Jeg tror bare jeg må erkende det er galt og ændre det til det foreslåede kode....
Avatar billede conrad Nybegynder
01. november 2006 - 17:06 #7
Tak for hjælpen, lægger du et svar?
Avatar billede hgc Nybegynder
02. november 2006 - 10:03 #8
svar
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester