SQL update CASE syntax fout?

Status
Niet open voor verdere reacties.

invictis

Gebruiker
Lid geworden
8 dec 2009
Berichten
17
Ik wil mijn tabel wedstrijden_punten updaten.
wanneer toto in voorspelling overeenkomt met toto in uitslag dan moet punten_toto in wedstrijden punten gevuld worden met 15 punten. Er zijn meerdere wedstrijden, dus wedstrijd_id punten moet overeenkomen met wedstrijd_id voorspelling en met wedstrijd_id uitslag

Hier onder mijn werk. Dit klopt blijkbaar niet :| wie helpt mij
[sql]
update wedstrijden_punten
SET punten_toto =
CASE
WHEN
V.toto = U.toto then '15'
ELSE
'0'
end)
FROM wst_voorspelling AS V
,wedstrijden AS U
,wedstrijden_punten AS P
WHERE
P.deelnemer_id = V.dlnr_id
and P.wedstrijd_id = V.wedstrijd_id
and V.wedstrijd_id = U.wedstrijd_id
[/sql]

Ik krijg een syntax fout in de FROM...
 
Laatst bewerkt door een moderator:
Na end) staat een haakje, waar is het haakje openen?
 
probeer het zo eens:

[sql]update wedstrijden_punten
SET punten_toto = CASE WHEN V.toto = U.toto then '15' ELSE '0' end
FROM wedstrijden_punten p inner join wst_voorspelling V on P.wedstrijd_id = V.wedstrijd_id and P.deelnemer_id = V.dlnr_id
inner join wedstrijden U on V.wedstrijd_id = U.wedstrijd_id[/sql]
 
Laatst bewerkt door een moderator:
Oplossing werkt nog niet.

Ik heb wel een goede query draaiende gekregen met insert into wat mijn probleem oplost.
Enige nadeel is dat ik dan altijd eerst de tabel moet legen.. dus wie mij toch verder kan helpen graag!
 
Je mist volgens mij nog een select:
[sql]
update wedstrijden_punten
SET punten_toto =
select CASE WHEN V.toto = U.toto then '15' ELSE '0' end
FROM wedstrijden_punten P
inner join wst_voorspelling V
on P.wedstrijd_id = V.wedstrijd_id
and P.deelnemer_id = V.dlnr_id
inner join wedstrijden U on V.wedstrijd_id = U.wedstrijd_id[/sql]
 
Laatst bewerkt door een moderator:
met select geeft hij :
Fout
SQL-query:
[sql]
UPDATE wedstrijden_punten SET punten_toto = SELECT
CASE WHEN V.toto = U.toto
THEN '15'
ELSE '0'
END
FROM wedstrijden_punten P
INNER JOIN wst_voorspelling V ON P.wedstrijd_id = V.wedstrijd_id
AND P.deelnemer_id = V.deelnemer_id
INNER JOIN wedstrijden U ON V.wedstrijd_id = U.wedstrijd_id
[/sql]
MySQL retourneerde:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Select
CASE WHEN V.toto = U.toto then '15' ELSE '0' end
FROM wedstrijden_punte' at line 3

zonder select:
SQL-query:
[sql]
UPDATE wedstrijden_punten SET punten_toto = CASE WHEN V.toto = U.toto THEN '15' ELSE '0' END FROM wedstrijden_punten P INNER JOIN wst_voorspelling V ON P.wedstrijd_id = V.wedstrijd_id AND P.deelnemer_id = V.deelnemer_id INNER JOIN wedstrijden U ON V.wedstrijd_id = U.wedstrijd_id
[/sql]
MySQL retourneerde:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM wedstrijden_punten P
inner join wst_voorspelling V
on P.wedstrijd_id = ' at line 4
 
Laatst bewerkt door een moderator:
Ik zie dat in MySQL het case-statement anders is dan in Oracle-sql, sorry.

[sql]UPDATE wedstrijden_punten SET punten_toto = SELECT
CASE WHEN V.toto = U.toto
THEN '15'
ELSE '0'
END CASE
FROM wedstrijden_punten P
INNER JOIN wst_voorspelling V ON P.wedstrijd_id = V.wedstrijd_id
AND P.deelnemer_id = V.deelnemer_id
INNER JOIN wedstrijden U ON V.wedstrijd_id = U.wedstrijd_id
[/sql]
Mocht dit niet werken, probeer dan eerst eens alleen de select-query uit te voeren:
[sql]
SELECT
CASE WHEN V.toto = U.toto
THEN '15'
ELSE '0'
END CASE
FROM wedstrijden_punten P
INNER JOIN wst_voorspelling V ON P.wedstrijd_id = V.wedstrijd_id
AND P.deelnemer_id = V.deelnemer_id
INNER JOIN wedstrijden U ON V.wedstrijd_id = U.wedstrijd_id[/sql]
 
Laatst bewerkt door een moderator:
De select zonder CASE achter END werkt.

Maar dit werkt dus niet:

SQL-query:
[sql]
UPDATE wedstrijden_punten SET punten_toto = SELECT
CASE WHEN V.toto = U.toto
THEN '15'
ELSE '0'
END
FROM wedstrijden_punten P
INNER JOIN wst_voorspelling V ON P.wedstrijd_id = V.wedstrijd_id
AND P.deelnemer_id = V.deelnemer_id
INNER JOIN wedstrijden U ON V.wedstrijd_id = U.wedstrijd_id
[/sql]
MySQL retourneerde:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT
CASE WHEN V.toto = U.toto
THEN '15'
ELSE '0'
END
FROM wedstrijden_pu' at line 1

Volgende geprobeerd
[sql]
UPDATE wedstrijden_punten SET punten_toto = SELECT[/sql]
en
[sql]UPDATE wedstrijden_punten SET punten_toto SELECT[/sql]
en
[sql]UPDATE wedstrijden_punten SET punten_toto =[/sql]
 
Laatst bewerkt door een moderator:
Helpt dit?
[sql]
UPDATE wedstrijden_punten P2 SET P2.punten_toto = SELECT
CASE WHEN V.toto = U.toto
THEN '15'
ELSE '0'
END
FROM wedstrijden_punten P
INNER JOIN wst_voorspelling V ON P.wedstrijd_id = V.wedstrijd_id
AND P.deelnemer_id = V.deelnemer_id
INNER JOIN wedstrijden U ON V.wedstrijd_id = U.wedstrijd_id
WHERE P2.wedstrijd_id = P.wedstrijd_id[/sql]
 
Laatst bewerkt door een moderator:
Ik val er een beetje middenin, dus misschien heb ik het mis, maar zo dan?
[sql]UPDATE wedstrijden_punten P2
SET P2.punten_toto =
( SELECT
CASE WHEN V.toto = U.toto THEN '15' ELSE '0' END
FROM wedstrijden_punten P
INNER JOIN wst_voorspelling V
ON P.wedstrijd_id = V.wedstrijd_id
AND P.deelnemer_id = V.deelnemer_id
INNER JOIN wedstrijden U
ON V.wedstrijd_id = U.wedstrijd_id
WHERE P2.wedstrijd_id = P.wedstrijd_id
)[/sql]

Eventueel kun je er nog een voorwaarde achteraan zetten zodat je niet steeds de hele tabel door hoeft. Deze bijvoorbeeld:[sql]WHERE P2.punten_toto IS NULL[/sql]
 
#1093 - You can't specify target table 'wedstrijden_punten' for update in FROM clause
 
Hmm, dat is inderdaad zo. Technisch werkt onderstaande query, lijkt me wel verstandig om even te controleren of het resultaat ook is wat je wilt:[sql]UPDATE wedstrijden_punten P2
SET P2.punten_toto =
( SELECT
CASE WHEN V.toto = U.toto THEN '15' ELSE '0' END
FROM wst_voorspelling V
INNER JOIN wedstrijden U
ON V.wedstrijd_id = U.wedstrijd_id
WHERE P2.wedstrijd_id = V.wedstrijd_id
)[/sql]
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan