Toon posts:

[SQL] Update meerdere records met subquery

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoe kan je het beste meerdere records met 1 statement updaten?

Ik heb een calamiteit, deze heeft meerdere stappen. Elke stap heeft een status.
Op het moment dat een calamiteit wijzigt, worden alle stappen opnieuw aangemaakt.
Sommige van de nieuwe stappen kunnen overeenkomen met de oude stappen. Is dit het geval + nog een aantal voorwaarden, dan moet de status van de nieuwe stap gelijk worden aan de status van de oude stap (UPDATE)

Helaas lukt me het niet om dit voor elkaar te krijgen. :-S
Ik heb het volgende:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
UPDATE vbb.vbb_calamiteit_hoofdstappen chp_new 
SET  chp_new.sts_id = (SELECT oud_status.sts_id
                         FROM (SELECT chp.CHF_ID, chp.sts_id
                              FROM   vbb.vbb_calamiteiten clt
                              ,    vbb.vbb_calamiteit_hoofdstappen chp
                              WHERE  clt.ID = :OLD_CLT_ID  
                              AND      clt.ID = chp.CLT_ID) oud_status
                         ,    (SELECT chp.CHF_ID
                              FROM   vbb.vbb_calamiteiten clt
                              ,     vbb.vbb_calamiteit_hoofdstappen chp
                              WHERE  clt.ID = :NEW_CLT_ID  
                              AND    clt.ID = chp.CLT_ID) nieuw_status
                         WHERE   oud_status.CHF_ID = nieuw_status.CHF_ID)
WHERE chp_new.CLT_ID = :NEW_CLT_ID
AND   chp_new.CHF_ID = ( SELECT oud_status.CHF_ID
                         FROM (SELECT chp.CHF_ID, chp.sts_id
                              FROM   vbb.vbb_calamiteiten clt
                              ,    vbb.vbb_calamiteit_hoofdstappen chp
                              WHERE  clt.ID = :OLD_CLT_ID  
                              AND      clt.ID = chp.CLT_ID) oud_status 
                         ,    (SELECT chp.CHF_ID, chp.sts_id
                              FROM   vbb.vbb_calamiteiten clt
                              ,     vbb.vbb_calamiteit_hoofdstappen chp
                              WHERE  clt.ID = :NEW_CLT_ID  
                              AND    clt.ID = chp.CLT_ID) nieuw_status
                         WHERE  oud_status.CHF_ID = nieuw_status.CHF_ID)
AND EXISTS (
SELECT tpl.ID 
FROM   vbb.vbb_calamiteitstappen_tpl tpl
WHERE  tpl.CHF_ID = :CHF_ID
AND    tpl.CLF_ID = :CLF_ID
AND    tpl.OPNIEUW_CALAMITEIT = 1
AND    tpl.OPNIEUW_SCHAAL = 1)

Zowel de SET krijgt twee rijen terug als de WHERE clause.
Ik krijg nu echter telkens de error: Single-row subquery returns more than one row!
Dit klopt

De SET krijg
2
2
en de Where krijgt:
5
6

ik wil dus dat hij eerst voor de eerste (5) de status op 2 zet. en daarna voor de 2e (6) de status op 2
Hoe kan ik dat het beste doen? Ik wil het eigenlijk zonder hulp van een procedure met cursor oid doen. Omdat hier geen verder ook geen gebruik wordt gemaakt van procedures.

alvast bedankt.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

"WHERE id =" moet je veranderen in "WHERE id IN". ;)

(Small een id kan niet gelijk zijn aan twee waarden tegelijk, maar hij kan wel in een verzameling van twee waarden zitten. ;))

Edit: in de SET kan dat echter niet.

[ Voor 67% gewijzigd door NMe op 30-08-2005 14:09 ]

'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.


Verwijderd

Topicstarter
Dank je voor de snelle reply.

wat ik dus wil is dat hij de recordset die ik ophaal doorloopt en dan de records per stuk update.
Met INSERT gaat dit vrij eenvoudig. En ik neem aan dat het met UPDATE ook moet. (ik dacht op deze manier), maar ik krijg het niet voor elkaar..

Wanneer ik IN gebruik, krijg ik de Single-row error bij de SET.