Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle - Join aktualisieren - Tabelle ohne Schlüsselerhaltung

Sie sollten dies mit einer korrelierten Unterabfrage tun können

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

Das Problem mit dem UPDATE Was Sie geschrieben haben, ist, dass Oracle nicht garantieren kann, dass es genau 1 tbl2.c gibt Wert, der einem einzelnen tbl1.b entspricht Wert. Wenn es mehrere Zeilen in tbl2 gibt für eine bestimmte Zeile in tbl1 , wird das korrelierte Update einen Fehler ausgeben, der angibt, dass eine einzeilige Unterabfrage mehrere Zeilen zurückgegeben hat. In diesem Fall müssten Sie der Unterabfrage Logik hinzufügen, um anzugeben, welche Zeile aus tbl2 stammt in diesem Fall zu verwenden.