webForumDet fria alternativet

Uppdatera 2 poster

ASPur ASP

13 svar · 265 visningar · startad av doggelito

doggelitoMedlem sedan juni 20003 076 inlägg
#1

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
#2
  update t set c1 = c2,c2 = c1

------------------
essentitia preter non sans multiplicandum

emissionMedlem sedan dec. 19996 721 inlägg
#3

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
#4

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
#5

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]

doggelitoMedlem sedan juni 20003 076 inlägg
#6

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
#7

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

doggelitoMedlem sedan juni 20003 076 inlägg
#8

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
#9

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
#10

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
#11

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
#12

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
#13

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
#14

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! :)

154 ms totalt · 3 externa anrop · v20260731065814-full.94fcd635
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
152 ms — hämta tråd, inlägg och bilagor (db)