Benutzer-Werkzeuge

Webseiten-Werkzeuge


Action disabled: index
prog:sql_update_syntax

Oracle SQL - Update und Merge mit Daten in einer Tabelle mit Werten aus einer zweiten Tabelle

Aufgabe: Daten in einer Tabelle mit Daten aus einer zweiten Tabelle aktualisieren.

Highland Kuh in Oberegen in den Dolomiten - hat wohl andere Sorgen

Update Lösung

Inline View für die SQL 92 Syntax

Die einfache INNER JOIN Syntax wird auch mit Oracle 12 nicht unterstützt, daher diese Lösung über eine „Inline View“ gewählt:

UPDATE(
  SELECT emp.PHONE_NUMBER
       , DEPARTMENT_ID 
   FROM EMPLOYEES emp INNER JOIN departments dept USING (DEPARTMENT_ID) 
  WHERE dept.DEPARTMENT_NAME='IT'
)
SET PHONE_NUMBER = '0890000'||to_char(DEPARTMENT_ID)
/

Alternativ traditionell:

UPDATE EMPLOYEES emp
   SET PHONE_NUMBER = '0890000'|| (  SELECT to_char(dept.DEPARTMENT_ID) 
                                       FROM departments dept 
 				      WHERE dept.DEPARTMENT_NAME= 'IT'   
	 			        AND dept.DEPARTMENT_ID  = emp.DEPARTMENT_ID )
WHERE emp.DEPARTMENT_ID IN ( SELECT DEPARTMENT_ID FROM departments dept WHERE dept.DEPARTMENT_NAME='IT')   										 
/

Es lassen sich auch mehrere Spalten auf einmal updaten:

UPDATE EMPLOYEES emp
   SET (PHONE_NUMBER , EMAIL)  =  (  SELECT '0890000'||to_char(dept.DEPARTMENT_ID),dept.DEPARTMENT_NAME||'@info.de' 
                                       FROM departments dept 
 				      WHERE dept.DEPARTMENT_NAME= 'IT'   
	 			        AND dept.DEPARTMENT_ID  = emp.DEPARTMENT_ID )
WHERE emp.DEPARTMENT_ID IN ( SELECT DEPARTMENT_ID FROM departments dept WHERE dept.DEPARTMENT_NAME='IT')   										 
/

Wenn das zu langsam wird hift dann nur noch PL/SQL

DECLARE
    cursor c_old_id  IS 
        SELECT ed.LOCALID,per.per_id_1  
          FROM event_detail ed  
            INNER JOIN ods.person per ON (per.per_id_3= ed.LOCALID);
    v_count pls_integer:=0;
BEGIN
     FOR rec IN c_old_id
     loop
        UPDATE event_detail SET LOCALID=rec.per_id_1 WHERE LOCALID=rec.LOCALID;
        dbms_output.put_line('Set '||rec.LOCALID||' to '||rec.per_id_1);
        v_count:=v_count+1;
     END loop;
    dbms_output.put_line('Update '||v_count||' Records');
END;
/

Merge Lösung

An einfachsten und am besten lesbar ist die Verwendung des Merge Befehles:

MERGE INTO EMPLOYEES emp 
USING departments dept 
   ON (dept.DEPARTMENT_ID  = emp.DEPARTMENT_ID AND dept.DEPARTMENT_NAME= 'IT' )
 WHEN MATCHED THEN
      UPDATE SET emp.PHONE_NUMBER = '0890000'||to_char(dept.DEPARTMENT_ID)
/	

Alternativ mit SQL Abfrage in den Using Clause:

MERGE INTO EMPLOYEES emp
USING ( SELECT * FROM departments WHERE DEPARTMENT_NAME= 'IT') dept
   ON (dept.DEPARTMENT_ID  = emp.DEPARTMENT_ID  )
 WHEN MATCHED THEN
      UPDATE SET emp.PHONE_NUMBER = '0890000'||to_char(dept.DEPARTMENT_ID)
/

Einschränkung! ⇒ ORA-38104: Columns referenced in the ON Clause cannot be updated:


Quellen

Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
prog/sql_update_syntax.txt · Zuletzt geändert: 2016/10/06 17:40 von gpipperr