Avatar billede martinstorm Nybegynder
27. august 2002 - 13:44 Der er 18 kommentarer og
2 løsninger

Brug af UPDATE på flere rækker

Hej
Er det muligt at bruge af UPDATE tabelnavn SET kolonnenavn på flere rækker ?
følgende giver fejl:

SQL> update trans set kol15 =(Select es.value from es, trans where trans.eqnum = es.eqnum
and es.aid = 'E1' and trans.eq9='TEST');

FEJL i linie 1:
ORA-01427: enkelt-rµkke underforesp°rgsel returnerer mere end Ún rµkke

trans indeholder 450 poster hvor kol15 skal opdateres.

Er der nogen med en løsning på dette eller ?
Avatar billede proaccess Nybegynder
27. august 2002 - 13:48 #1
Det afhænger om din aktuelle DB understøtter JOINS i UPDATE...

UPDATE trans, es SET trans.kol15=es.value WHERE trans.eqnum=es.eqnum AND es.aid='E1' AND trans.eq9='TEST';
Avatar billede teepee Nybegynder
27. august 2002 - 13:55 #2
Tror du ikke du skal have noget min(), max() eller lignende med? For som der står returnerer én af dine trans.eqnum åbenbart mere end en række ved select/join fra trans+es.
Avatar billede teepee Nybegynder
27. august 2002 - 13:57 #3
Select count(es.value), trans.eqnum
  from es, trans where trans.eqnum = es.eqnum
and es.aid = 'E1' and trans.eq9='TEST'
group by trans.eqnum
having count(es.value) > 1

måske kan denne fortælle dig hvilke rækker der skal i søgelyset
Avatar billede martinstorm Nybegynder
27. august 2002 - 14:02 #4
proaccess>> Oracle8i Release 8.1.7.0.0 er Db'en.
Teepee>> jeg prøver lige din med count()
Avatar billede martinstorm Nybegynder
27. august 2002 - 14:33 #5
proaccess>>
UPDATE trans, es SET trans.kol15=es.value WHERE trans.eqnum=es.eqnum AND es.aid='E1' AND trans.eq9='TEST';
returnere denne fejl
FEJL i linie 1:
ORA-00971: manglende SET-n°gleord
Så det er måske ikke understøttet som du skriver
Avatar billede martinstorm Nybegynder
27. august 2002 - 14:49 #6
Teepee>> Jeg har prøvet din
Select count(es.value), trans.eqnum
  from es, trans where trans.eqnum = es.eqnum
and es.aid = 'E1' and trans.eq9='TEST'
group by trans.eqnum
having count(es.value) > 1

den returnere "Ingen rækker er valgt"! mærkeligt - men nedenstående select hvor count(), group by og having er fjernet returnere det rigtige antal poster...

Select es.value, trans.eqnum from es, trans where trans.eqnum = es.eqnum and es.aid = 'E1' and trans.eq9='TEST';

Har du/I flere bud på løsning af dette ?
Avatar billede teepee Nybegynder
27. august 2002 - 15:09 #7
Prøv at sætte alias på dine to udgaver af trans tabellen. Du bruger den jo både i update og select
Avatar billede teepee Nybegynder
27. august 2002 - 15:11 #8
update trans t1 set kol15 =(Select es.value
                              from es, trans t2
                            where trans.eqnum = es.eqnum
                              and es.aid = 'E1'
                              and t2.eq9='TEST'
                              and t2.eqnum = t1.eqnum);

Passer dette bedre?
Avatar billede martinstorm Nybegynder
27. august 2002 - 16:42 #9
teepee>>
pdate trans t1 set kol15 =(Select es.value
                              from es, trans t2
                            where t1.eqnum = es.eqnum // rettet til t1
                              and es.aid = 'E1'
                              and t2.eq9='TEST'
                              and t2.eqnum = t1.eqnum);

jeg har prøvet ovenstående men det virker son om det hænger...
Tak for hjælpen indtil nu , jeg fortsætter i morgen. Spm er åbent indtil da hvis nogen har et forslag.
Avatar billede martinstorm Nybegynder
28. august 2002 - 08:49 #10
Teepee>> det virker med dit forslag ang. aliaser - dog ske opdateringen noget langsomt (es indeholder ca 400000 poster )
Jeg giver teepee 55 points da du har bidraget med mest hjælp, tak!.  Proaccess får de sidste 5 for hans bidrag.
Avatar billede teepee Nybegynder
28. august 2002 - 09:45 #11
Du mangler måske et index? Er der index på eqnum+aid?
Avatar billede martinstorm Nybegynder
28. august 2002 - 10:10 #12
Ja, der er et index der består af es.eqnum, es.aid samt es.sid. es.sid er pt. en konstant.
Avatar billede teepee Nybegynder
28. august 2002 - 10:42 #13
Hvis kolonner er specificeret i den rækkefølge du nævner skulle det jo være godt nok. Måske er det eq9=TEST der er problemet. Har denne index? Hvis ikke, hvis der kun er få værdier, så ville et bitmapped index måske være sagen.
Avatar billede martinstorm Nybegynder
28. august 2002 - 10:54 #14
Trans tabellen er helt uden indexs. Hvad mener du med et bitmapped index ?
Avatar billede teepee Nybegynder
28. august 2002 - 13:11 #15
Hvis en tabel kun har et begrænset antal mulige værdier, men mange rækker, kan man med fordel lave et index bitmapped, i stedet for et almindeligt b-træ struktur index. Syntaxen er blot CREATE BITMAP INDEX ... Så hvis du har fire mulige værdier og 10.000.000 rækker skal det helt sikkert være bitmapped. Der er dog mange andre faktorer der spiller ind, så hvis du er i tvivl så bare lav et alm. index eler prøv begge dele (en ad gangen altså!).
Avatar billede teepee Nybegynder
28. august 2002 - 13:13 #16
Men hvis trans kun indeholder 450 rækker er det vist ikke her at der skal gribes ind...
Avatar billede martinstorm Nybegynder
28. august 2002 - 15:36 #17
Trans indeholder ialt 6707 poster hvor kun 439 skal opdateres, es indeholder ca. 405000.
Jeg prøvede at lave et almindeligt index men det tog stadigvæk samme tid (lang  tid!). Hvis indexet skal være unikt på Trans kræver det at ca. 10 kolonner skal indgå.
Avatar billede teepee Nybegynder
28. august 2002 - 22:41 #18
det er et longshot, men du kan prøve at skrive

select /*+ ORDERED */ es.value .....

i updaten
Avatar billede martinstorm Nybegynder
30. august 2002 - 08:55 #19
Det giver en fejl ORA-00923: from nøgleord blev ikke fundet i forventet posistion.
Avatar billede teepee Nybegynder
30. august 2002 - 10:39 #20
Jeg er heller ikke sikker på at man må i en update, og jeg ved ikke om det virker hvis man skriver det hvor man normalt placerer hintet, nemlig efter første ord i en DML statement, dvs. lige efter UPDATE... Ideen var at den skulle tage es og trans i den rækkefølge de er nævnt....
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