26. oktober 2006 - 19:32Der 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)
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
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?
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 ?
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 ?
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.