PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

CTE-Löschung nicht festgeschrieben, bis die folgenden Anweisungen abgeschlossen sind

Dies wird erwartet und dokumentiert.

Zitat aus dem Handbuch

Sie können Verwenden Sie verkettete CTEs, um das Unternehmen zu löschen:

with deleted_emp as (
  delete from employee 
  where id = 1 
  returning company_id, id as employee_id
)
delete from company
where id in (select company_id from deleted_emp) 
  and not exists (select * 
                  from employee e
                     join deleted_emp af 
                       on af.company_id = e.company_id 
                      and e.id <> af.employee_id) 

Es ist wichtig, den gerade gelöschten Mitarbeiter aus der Liste not exists auszuschließen Unterabfrage, da diese immer in der zweiten Löschanweisung sichtbar ist und daher die Nichtexistenz niemals wahr wäre. Die Unterabfrage prüft also im Wesentlichen, ob es einen anderen Mitarbeiter als den gelöschten gibt, der demselben Unternehmen zugewiesen ist.

Online-Beispiel:https://rextester.com/IVZ78695