sql >> Database >  >> RDS >> Oracle

Met en UPDATE-instructies in dezelfde SQL-query gebruiken

U kunt een with-clausule gebruiken in een update; je hoeft het alleen maar op de juiste plaats te doen:

UPDATE mytable
   SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT newvalue
               FROM   temp
               WHERE  mytable.name = temp.oldvalue);

U wilt echter waarschijnlijk alleen de rijen bijwerken die in de tijdelijke subquery bestaan, dus u hebt een extra where-clausule nodig:

UPDATE mytable
   SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT newvalue
               FROM   temp
               WHERE  mytable.name = temp.oldvalue)
WHERE  EXISTS (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT NULL
               FROM   temp
               WHERE  mytable.name = temp.oldvalue);

U kunt ook een MERGE-instructie gebruiken:

merge into mytable tgt
  using (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                      (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                     )
         SELECT mytable.rowid r_id,
                temp.newvalue
         FROM   temp
         inner  join mytable on mytable.name = temp.oldvalue) src
    on (tgt.rowid = src.r_id)
when matched then
update set tgt.name = src.newvalue;

NB je moet deelnemen aan de eigenlijke tabel in de bronquery van de samenvoeginstructie omdat je probeert de kolom bij te werken waaraan wordt toegevoegd, wat je niet kunt doen in een samenvoeginstructie - daarom heb ik de samenvoeging overgeschakeld naar doe mee op mytable.rowid.

U zou beide verklaringen moeten testen om te zien welke het meest presteert op uw gegevens.



  1. Hoe Cross Apply en Split String in MySQL weer te geven?

  2. Het uitvoeren van een mysql-query vanuit phpmyadmin veranderde slechts 1 record. Geprobeerd ssh maar zelfde probleem

  3. Is er een manier om meerdere datumnotaties te converteren naar datetime python?

  4. magento printvriendelijke pagina voor producten