Neue Funktionen der Oracle-Datenbank 23c zum Aktualisieren und Löschen

Die Oracle-Datenbank 23c begann, die Verwendung von JOIN-Verbindungen in UPDATE- und DELETE-Anweisungen zu unterstützen, um aktualisierte und gelöschte Datenquellen abzurufen.

Beispieltabelle

In diesem Artikel wird eine Beispieltabelle verwendet, die von GitHub heruntergeladen werden kann . Anschließend wird ein emp_devp basierend auf der Mitarbeitertabelle erstellt:

CREATE TABLE emp_devp 
AS 
SELECT * FROM employee e 
WHERE dept_id = 4; 

UPDATE emp_devp 
SET salary = 0;
COMMIT;

Die Gehaltsfelder in emp_devp werden alle auf 0 gesetzt, um die zugehörigen Aktualisierungen zu validieren.

Verbandsaktualisierung

Schauen wir uns zunächst die Daten in emp_devp an:

SELECT emp_id, emp_name, salary, bonus, email
FROM emp_devp
ORDER BY emp_id;

emp_id|emp_name|salary|bonus  |email              |
------+--------+------+-------+-------------------+
     9|赵云     |  0.00|6000.00|zhaoyun@shuguo.com |
    10|廖化     |  0.00|       |liaohua@shuguo.com |
    11|关平     |  0.00|       |guanping@shuguo.com|
    12|赵氏     |  0.00|       |zhaoshi@shuguo.com |
    13|关兴     |  0.00|       |guanxing@shuguo.com|
    14|张苞     |  0.00|       |zhangbao@shuguo.com|
    15|赵统     |  0.00|       |zhaotong@shuguo.com|
    16|周仓     |  0.00|       |zhoucang@shuguo.com|
    17|马岱     |  0.00|       |madai@shuguo.com   |

Dann aktualisieren wir die Daten in emp_devp, indem wir die Mitarbeitertabelle mit dem Feld emp_id verknüpfen, einschließlich Gehalt, Bonus und E-Mail, und die Daten stammen vom Mitarbeiter.

UPDATE emp_devp ed
SET ed.salary = e.salary,
    ed.bonus = e.bonus, 
    ed.email = e.email
FROM employee e 
WHERE e.emp_id = ed.emp_id;

Oracle verwendet die UPDATE FROM-Syntax für relationale Aktualisierungen, andere Datenbanken verwenden möglicherweise die UPDATE JOIN-Syntax.

Schauen wir uns nun die aktualisierten emp_devp-Daten an:

SELECT emp_id, emp_name, salary, bonus, email
FROM emp_devp
ORDER BY emp_id;

emp_id|emp_name|salary  |bonus  |email              |
------+--------+--------+-------+-------------------+
     9|赵云     |15000.00|6000.00|zhaoyun@shuguo.com |
    10|廖化     | 6500.00|       |liaohua@shuguo.com |
    11|关平     | 6800.00|       |guanping@shuguo.com|
    12|赵氏     | 6600.00|       |zhaoshi@shuguo.com |
    13|关兴     | 7000.00|       |guanxing@shuguo.com|
    14|张苞     | 6500.00|       |zhangbao@shuguo.com|
    15|赵统     | 6000.00|       |zhaotong@shuguo.com|
    16|周仓     | 8000.00|       |zhoucang@shuguo.com|
    17|马岱     | 5800.00|       |madai@shuguo.com   |

In früheren Versionen konnten wir Unterabfragen oder die MERGE-Anweisung verwenden, um den gleichen Effekt zu erzielen:

UPDATE emp_devp ed
SET (salary, bonus, email) = (SELECT salary, bonus, email
                              FROM employee e 
                              WHERE e.emp_id = ed.emp_id)
WHERE EXISTS (SELECT 1
              FROM employee e
              WHERE e.emp_id = ed.emp_id);

MERGE INTO emp_devp ed
USING employee e
ON (e.emp_id = ed.emp_id)
WHEN MATCHED THEN 
  UPDATE SET ed.salary = e.salary,
             ed.bonus = e.bonus,
             ed.email = e.email;

Wenn die Datenquelle des Aktualisierungsvorgangs aus mehreren Tabellen stammt, können diese durch JOIN verbunden werden. Im folgenden Beispiel wird die Jobtabelle als Quelle für Datenaktualisierungen hinzugefügt:

UPDATE emp_devp ed
SET ed.salary = e.salary,
    ed.bonus = e.bonus, 
    ed.email = e.email
FROM employee e 
JOIN job j ON (e.job_id = j.job_id AND j.job_title = '程序员')
WHERE e.emp_id = ed.emp_id;

Die obige Anweisung aktualisiert nur die Mitarbeiterinformationen, deren Berufsbezeichnung „Programmierer“ in emp_devp lautet.

Löschung der Assoziation

Wir können Mitarbeiter auch in emp_devp basierend auf den Daten in Employee löschen. Das folgende Beispiel verwendet emp_id als Verknüpfungsfeld zwischen den beiden Tabellen und fügt außerdem eine zusätzliche Filterbedingung hinzu:

DELETE emp_devp ed
FROM employee e
WHERE ed.emp_id = e.emp_id
AND e.salary < 10000;

Sehen Sie sich die Daten in emp_devp an:

SELECT emp_id, emp_name, salary, bonus, email
FROM emp_devp
ORDER BY emp_id;

EMP_ID|EMP_NAME|SALARY|BONUS|EMAIL             |
------+--------+------+-----+------------------+
     9|赵云     | 15000| 6000|zhaoyun@shuguo.com|

Wenn die Datenquelle des Löschvorgangs aus mehreren Tabellen stammt, können diese durch JOIN verbunden werden. Das folgende Beispiel fügt die Jobtabelle als Quelle für die Datenlöschung hinzu:

DELETE emp_devp ed
FROM employee e
JOIN job j ON j.job_id = e.job_id
WHERE ed.emp_id = e.emp_id
AND j.job_title = '开发经理';

рекомендация

отblog.csdn.net/horses/article/details/130855761