Jag vill kunna plocka ut 2 st poster i från min access-databas, sen vill jag ta värdet ifrån första postens kolumn som heter "nummer" med värdet "12" (t.ex.) och byta plats med den andra postens värde "7" (t.ex.).
Alltså, uppdatera första postens värde med den andra postens värde och tvärsom.
Om ni förstår mig, har någon en bra lösning?
LarsGMedlem sedan dec. 200012 464 inlägg update t set c1 = c2,c2 = c1
------------------
essentitia preter non sans multiplicandum
emissionMedlem sedan dec. 19996 721 inlägg Nej, så kan man inte göra, för då blir
c1=c2=c1, dvs. man får c2s värde i båda kolumnerna
På ett eller annat sätt måste man mellanlagra en av kolumnerna, vilket smidigast görs mha en extrakolumn
update t set temp = c1
update t set c1 = c2,c2=temp
[r]Å ena sidan kan man göra det i en UPDATE (temp = c1,c1 = c2,c2=temp), å andra sidan kan man sannolikt inte garantera exekveringsordningen, så tre separata är säkrast[/r]
[Redigerat av emission den 14 aug 2001]
LarsGMedlem sedan dec. 200012 464 inlägg Jag vet inte vad du använder för dbms, men det update-statementet fungerar alldeles utmärkt med den jag använder.
Och så skall det vara enligt SQL-standarden:
The <value expression>s of a set clause are effectively evaluated for each row of T before updating any row of T
------------------
essentitia preter non sans multiplicandum
emissionMedlem sedan dec. 19996 721 inlägg Det gläder mig att det ska vara så, men det funkar åtminstone inte så i MySQL. Access brukar inte vara bättre, men är det alldeles säkert i det här fallet.
Gött! :)
The <value expression>s of a set clause are effectively evaluated for each row of T before updating any row of T
Vid närmare eftertanke så säger ju inte det något om detta problem, eftersom vi fortfarande evaluerar inom en rad.
LarsG, finns det något som fastlägger exekveringsordningen på SET-satserna?
[Redigerat av emission den 14 aug 2001]
Hmm, missförstår jag er eller missförstår ni mig.
Om man nu ska använda LarsG rad:
update t set c1 = c2,c2 = c1
så uppdaterar väl den två kolumner i en och samma post eller?
Problemet som jag har är: kolumnen i två poster som ska byta plats.
LarsGMedlem sedan dec. 200012 464 inlägg Min fråga är tänkt tänkt att byta värden i två kolumner i alla poster.
Dvs om t innehåller
C1!C2
-----
1!2
2!3
så kommer den efter min update att innehålla
C1!C2
-----
2!1
3!2
om din DBMS fungerar enligt standard.
emission
Jag förstår inte varför evalueringsordningen skulle förändra något.
------------------
essentitia preter non sans multiplicandum
Aha, nu förstår jag hur ni tror att jag menar!(förlåt om jag är dålig på att förklara mig!)
Jag tar det från början igen:
Jag har som sagt en tabell med en kolumn som heter "nummer". Sen vill jag ta ut två st poster och byta värdet från "nummer" i post 1 till post 2 och från "nummer" i post 2 till post 1.
Hajjar ni nu?
Typ så här:
nummer
-----------
12
7
till
nummer
-----------
7
12
emissionMedlem sedan dec. 19996 721 inlägg Jag förstår inte varför evalueringsordningen skulle förändra något.
Det var en allmän fråga om SQL-standarden. Om DMBS:en inte beter sig som du beskrev, så är ordningen av betydelse.
LarsGMedlem sedan dec. 200012 464 inlägg Jag förstår ;)
Det är faktiskt inte specificerat i vilken ordning uttrycken evalueras.
Det finns ju vissa andra fall där det har betydelse, även om man evaluerar allt innan update, så det blir kanske en förfrågan/felrapport till iso.
------------------
essentitia preter non sans multiplicandum
LarsGMedlem sedan dec. 200012 464 inlägg Du får nog göra det mer programmeringsmässigt. Jag förutsätter att du har något unikt id i tabellen och om du t.ex. vill byta värden för posterna med id 11 och 47 så:
sql = "select id,nummer from t " & _
" where id in (11,47) "
set rs = connect.execute(sql)
while not rs.eof
if cint(rs("id")) = 11 then
sql1 = "update t set nummer = " & _
rs("nummer") & _
" where id = 47 "
else
sql2 = "update t set set nummer = " & _
rs("nummer") & _
" where id = 11 "
end if
rs.movenext
wend
rs.close
conn.execute sql1,,128
conn.execute sql2,,128
------------------
essentitia preter non sans multiplicandum
emissionMedlem sedan dec. 19996 721 inlägg Det är faktiskt inte specificerat i vilken ordning uttrycken evalueras.
Huvudsaken är att det är specificerat så, så att man vet....
Faktum kvarstår...
"The <value expression>s of a set clause are effectively evaluated for each row of T before updating any row of T"
...tycker inte jag säger något om detta problem. Det kanske finns någon annan regel?
LarsGMedlem sedan dec. 200012 464 inlägg Jag tolkar texten som att man (konceptuellt) skall beräkna alla de nya värdena för kolumnerna innan man gör någon update överhuvudtaget.
Sen så står det också att en update sker genom att man tar en kopia av den befintliga raden och modifierar den och att värdet av en kolumnreferens är värdet i den kolumnen i den befintliga raden.
------------------
essentitia preter non sans multiplicandum
emissionMedlem sedan dec. 19996 721 inlägg Sen så står det också att en update sker genom att man tar en kopia av den befintliga raden och modifierar den och att värdet av en kolumnreferens är värdet i den kolumnen i den befintliga raden.
I that case, the thing is beef! :)