sql >> Database teknologi >  >> RDS >> Oracle

Oracle - update join - ikke nøglebevaret tabel

Du burde være i stand til at gøre dette med en korreleret underforespørgsel

UPDATE tbl1 t1
   SET t1.b = (SELECT c
                 FROM tbl2 t2
                WHERE t1.id = t2.id
                  AND t1.a  = t2.a
                  AND t1.b  = t2.b
                  AND t2.d  = 'a')
 WHERE t1.a = 'foo'
   AND EXISTS( SELECT 1
                 FROM tbl2 t2
                WHERE t1.id = t2.id
                  AND t1.a  = t2.a
                  AND t1.b  = t2.b
                  AND t2.d  = 'a')

Problemet med UPDATE det du har skrevet er, at Oracle ikke kan garantere, at der er præcis 1 tbl2.c værdi, der svarer til en enkelt tbl1.b værdi. Hvis der er flere rækker i tbl2 for en bestemt række i tbl1 , vil den korrelerede opdatering afgive en fejl, der indikerer, at en enkelt-række-underforespørgsel returnerede flere rækker. I så fald skal du tilføje noget logik til underforespørgslen for at angive, hvilken række fra tbl2 at bruge i så fald.



  1. Efter en enkelt transaktions dødvande på tværs af SQL Server-versioner

  2. VÆLG eller INDSÆT en række i én kommando

  3. sqlite returnerede:fejlkode =1, msg =ingen sådan kolonne:køkken1

  4. Sådan fjerner du ledende og efterfølgende tegn i SQL Server