Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL] Update op basis van interne loop

Pagina: 1
Acties:

  • Da Weef
  • Registratie: Januari 2004
  • Laatst online: 31-10 15:59
----- OOPS! Vergeten de Titel af te typen... excuses daarvoor -----


Ik ben een complete Access en SQL n00b en kom niet uit het volgende (waarschijnlijk simpele) probleem:

Ik heb een tabel die er ongeveer als volgt uitziet

ID_1ID_2Getal
A 2
B C 3
C B 4
D 2


Voor de rij waar ID_2 een waarde 'X' heeft wil ik controleren of in de rij waar ID_1 waarde 'X' heeft de waarde van getal groter is dan de waarde van getal de 'huidige' rij. Als dit het geval is moet de waarde van getal geupdate worden naar de waarde van getal in rij 'X'.

Voor het bovenstaande voorbeeld zou dit beteken dat alleen het getal van rij 2 moet worden veranderd van 3 naar 4.

In vage pseudo code:

code:
1
2
3
4
5
for each row i
   if ID_2 is not NULL
      find row j where ID_1 is equal to ID_2(i)
         then if Getal(i) < Getal(j)
            then Getal(i) = Getal(j)


Lijkt een weinig moeilijke handeling, maar ik krijg het niet voor elkaar. Iemand een idee hoe ik hier een query voor kan bouwen?

Alvast bedankt :w

.


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 15:08

Dido

heforshe

In je voorbeeld is het getal van rij 3 al 4, dus dat kan niet veranderen.

Maar volgens mij wil je ook niet een getal updaten in rij X, maar in de rij waar ID_1 of 2 X is. Welke van de twee is me niet duidelijk.

Iets als dit zou kunnen werken (ik weet niet of dit precies doet wat je wilt, want dat is me niet helemaal duidelijk).
SQL:
1
2
3
4
UPDATE a
SET a.getal = b.getal
FROM tabel a join tabel b on a.ID_2 = b.ID_1
WHERE a.getal > b.getal


Zie ook http://www.coldfusionmuse...m/2005/7/15/Join%20Update
(8ste hit op "SQL UPDATE" met google)

[ Voor 44% gewijzigd door Dido op 19-09-2008 18:09 ]

Wat betekent mijn avatar?


  • Da Weef
  • Registratie: Januari 2004
  • Laatst online: 31-10 15:59
Inderdaad niet helemaal duidelijk, maar ook lastig uit te leggen...

Als in rij (i) ID_2 de waarde 'X' heeft wil ik de waarde van Getal in rij (i) updaten met de waarde van Getal in de rij waar ID_1 de waarde 'X' heeft, mits de waarde van Getal in die rij hoger is dan de waarde van Getal in rij [(i)

Man, ik wordt er zelf duizelig van... Terwijl het probleem niet zoooooo lastig lijkt.

[ Voor 11% gewijzigd door Da Weef op 19-09-2008 18:08 ]

.


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 15:08

Dido

heforshe

Ik heb de 1 en de 2 in de join hierboven omgedraaid.

Ik kan eht hier niet uitproberen :)

Wat betekent mijn avatar?


  • Da Weef
  • Registratie: Januari 2004
  • Laatst online: 31-10 15:59
Dido schreef op vrijdag 19 september 2008 @ 18:00:
In je voorbeeld is het getal van rij 3 al 4, dus dat kan niet veranderen.

Maar volgens mij wil je ook niet een getal updaten in rij X, maar in de rij waar ID_1 of 2 X is. Welke van de twee is me niet duidelijk.

Iets als dit zou kunnen werken (ik weet niet of dit precies doet wat je wilt, want dat is me niet helemaal duidelijk).
SQL:
1
2
3
4
UPDATE a
SET a.getal = b.getal
FROM tabel a join tabel b on a.ID_2 = b.ID_1
WHERE a.getal > b.getal


Zie ook http://www.coldfusionmuse...m/2005/7/15/Join%20Update
(8ste hit op "SQL UPDATE" met google)
Bedankt, Ik zal er later naar kijken, eerst ff snel mn trein naar huis en het weekend halen ;)

.


  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 29-11 23:56
Ik denk dat je zoiets zoekt:
SQL:
1
2
3
4
5
update tabel b1 
set b1.getal = 
(select max(b2.getal) from tabel b2 
 where b2.ID_2 = b1.ID_1 and b2.getal > b1.getal
)


Edit: even de enters geplaatst.

@hieronder: ik heb dit maar even snel in elkaar gezet en niet getest. Daarom zei ik ook 'ik denk dat je "zoiets" zoekt. Die max(b2.getal) had ik gedaan in het geval er meerdere rijen zijn waar ID_2 op ID_1 past.
We hadden in ieder geval dezelfde gedachte

[ Voor 47% gewijzigd door The Fox NL op 19-09-2008 20:39 ]


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 15:08

Dido

heforshe

The Fox NL: Wat gebeurt er als b2.getal <= b1.getal? Dan levert je slect NULL op :P

Overigens snap ik die max(b2.getal) niet.

Als je ergens zou werken met max(b1.getal, b2.getal) zou ik het wel begrijpen ;)

edit: en als je wat enters in je code zet wordt ie leesbaarder, en blijft de layout intact :)

[ Voor 61% gewijzigd door Dido op 19-09-2008 18:23 ]

Wat betekent mijn avatar?


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Da Weef schreef op vrijdag 19 september 2008 @ 17:54:
----- OOPS! Vergeten de Titel af te typen... excuses daarvoor -----
Maak dan even een topicreport (Afbeeldingslocatie: http://tweakimg.net/g/forum/templates/tweakers/images/icons/icon_hand.gif) aan waarin je een suggestie doet voor een goeie titel. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Da Weef
  • Registratie: Januari 2004
  • Laatst online: 31-10 15:59
Ik probeer de codes hierboven te implementeren maar loop tegen een onverwachte foutmelding aan:

"De bewerking moet worden uitgevoerd op een query die kan worden bijgewerkt."
(Engels: "Operation must use an updateable query")

Hoezo geen permissie om te wijzigen???

Ik gebruik trouwens een gare oude versie: ACCESS 97. Maar dat moet toch niet uitmaken?

.


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

De oplossing hangt er een beetje van af of er meerdere waarden zijn per id. Is er maar één dan volstaat een updatequery a la Dido (met een ietsjepietsje andere syntax ;) en anders moet je met dmax() aan de gang.

offtopic:
Voor Access hebben het off forum

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:45

TeeDee

CQB 241

Je (engelse) foutmelding al eens door Google gehaald?

Daar komt o.a. dit KB artikel uit

Heart..pumps blood.Has nothing to do with emotion! Bored


  • Da Weef
  • Registratie: Januari 2004
  • Laatst online: 31-10 15:59
De oplossing hangt er een beetje van af of er meerdere waarden zijn per id. Is er maar één dan volstaat een updatequery a la Dido (met een ietsjepietsje andere syntax ;) en anders moet je met dmax() aan de gang.

offtopic:
Voor Access hebben het off forum
ID_1 is uniek, ID_2 is dat niet noodzakelijk.

offtopic:
Office forum is inderdaad logischer. Ik zocht gewoon naar een topic met [ACCES] in de Titel en heb daar mijn topic gestart. In dit geval dus hier
Je (engelse) foutmelding al eens door Google gehaald?

Daar komt o.a. dit KB artikel uit
Uiteraard heb ik ook gegoogled, maar daar krijg ik zoals het stuk dat jij vond vooral stukken over ASP.NET, en daar is het meestal gewoon dat er inderdaad ergens een permissie niet goed is geregeld voor zover ik het begrijp. Nu begrijp ik er misschien gewoon geen snars van, maar bij een operatie in ACCESS zelf is een dergelijk permissie issue toch niet logisch?

.


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

SQL:
1
2
3
4
5
UPDATE Tabel AS a, Tabel AS b SET a.waarde = b.waarde
WHERE (a.id1=[b].[id2]) AND (b.waarde>[a].[waarde]);

UPDATE Tabel AS a INNER JOIN Tabel AS b 
ON (a.waarde<b.waarde) AND (a.id1=b.id2) SET a.waarde = b.waarde;

Alle twee doen ze exact hetzelfde, alleen de syntax van de join verschilt naar voorkeur. Het nadeel is dat in het geval b twee keer voorkomt in id2, dat de laatste waarde uiteindelijk wordt weggeschreven. Als het perse de grootste waarde moet zijn gebruik je dit:

SQL:
1
2
UPDATE Tabel SET Tabel.waarde = DMax("waarde","tabel","id2='" & [id1] & "'")
WHERE DMax("waarde","tabel","id2='" & [id1] & "'")>[waarde];


Alleen dan mag je bij een fatsoenlijk grote recordset koffie gaan drinken. :)

[ Voor 5% gewijzigd door Lustucru op 20-09-2008 16:03 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • Da Weef
  • Registratie: Januari 2004
  • Laatst online: 31-10 15:59
Super! De oplossing van Lustucru lijkt prima te werken.

Overigens aangezien ID_1 uniek is, hoef ik me toch geen zorgen te maken dat er iets wordt overschreven?

Anders wordt het zeker een emmertje koffie, met 25.000 records ;)

.


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Het gaat om deze situatie:
ID_1ID_2Getal
A 2
B C 3
C B 5
DB 4

De eerste twee query's zien 2 updates voor rij 2 en het eindresultaat zal zijn dat rij 2 de waarde 4 krijgt. Pas als je de query nog een keer draait krijgt hij de waarde 5.
Dat kan dus één keer met die dmax() functie. Aggregated subquery's in updatequerys worden door Access niet ondersteund.

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • Da Weef
  • Registratie: Januari 2004
  • Laatst online: 31-10 15:59
Ow ik zie al waar het misverstand zit. De code die ik gebruik, en ook de functionaliteit heeft die ik zocht, is als volgt:

SQL:
1
2
UPDATE Tabel AS a INNER JOIN Tabel AS b 
ON (a.waarde<b.waarde) AND       (a.id2=b.id1)        SET a.waarde = b.waarde;


Jij had in jouw code ID1 en ID2 omgedraaid. In de code hierboven hoef ik me volgens mij geen zorgen te maken aangezien ID1 uniek is.

De implementatie is in ieder geval goed zo. Helaas ben ik tegen andere complicaties gelopen, maar die liggen in de aard van de data vrees ik. In ieder geval bedankt!

[ Voor 20% gewijzigd door Da Weef op 22-09-2008 01:09 ]

.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Da Weef schreef op zaterdag 20 september 2008 @ 13:38:
offtopic:
Office forum is inderdaad logischer. Ik zocht gewoon naar een topic met [ACCES] in de Titel en heb daar mijn topic gestart. In dit geval dus hier
:X Of je leest gewoon even Waar hoort mijn topic?
Ik weet niet welk topic je gevonden hebt, maar het is of oud, of niet gezien en hoort dus (ook) niet hier of niet office-specifiek ondanks de tag. Daarom kun je je beter baseren op bovenstaande informatie bij het plaatsen van een topic ;)

Anyhow: PRG >> OFF

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Da Weef schreef op maandag 22 september 2008 @ 01:06:
Ow ik zie al waar het misverstand zit. De code die ik gebruik, en ook de functionaliteit heeft die ik zocht, is als volgt:

SQL:
1
2
UPDATE Tabel AS a INNER JOIN Tabel AS b 
ON (a.waarde<b.waarde) AND       (a.id2=b.id1)        SET a.waarde = b.waarde;


Jij had in jouw code ID1 en ID2 omgedraaid. In de code hierboven hoef ik me volgens mij geen zorgen te maken aangezien ID1 uniek is.

De implementatie is in ieder geval goed zo. Helaas ben ik tegen andere complicaties gelopen, maar die liggen in de aard van de data vrees ik. In ieder geval bedankt!
Prima, maar dan klopt is het voorbeeld in de TS ambigue niet. :X

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • Da Weef
  • Registratie: Januari 2004
  • Laatst online: 31-10 15:59
Het voorbeeld klopt wel, ik heb het misschien niet heel handig uitgelegd.
Voor de rij waar ID_2 een waarde 'X' heeft wil ik controleren of in de rij waar ID_1 waarde 'X' heeft de waarde van getal groter is dan de waarde van getal de 'huidige' rij. Als dit het geval is moet de waarde van getal geupdate worden naar de waarde van getal in rij 'X'.
Voor de tabel bij het voorbeeld geldt dan in de tweede rij: ID_2 = C. Vervolgens zoeken naar waar ID_1 =C, in dit geval de derde rij. Vervolgens kijken of Getal in de tweede rij kleiner is dan Getal in de derde rij, zo ja --> update Getal in de tweede rij.

Maargoed, dit heeft me weer mooi in slaap gesust ;) nogmaals bedankt en wat mij betreft kan hier een slotje.

offtopic:
Ps. Volgende keer loop ik netjes de FAQ door voor topiclocatie

.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Een slotje is niet nodig op een topic als je je oplossing hebt. Zie daarvoor ook onze faq betreffende topiceinde.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1