Lassen Sie mich das anhand eines Beispiels etwas näher erläutern.
Aufgabe: Korrigieren Sie die Information, dass Abiturienten sich früher an der Universität beworben haben, als sie ihre Zeugnisse bekommen haben (ja, sie haben ihre Zeugnisse früher bekommen, als sie ausgestellt wurden (zum angegebenen Zeugnisdatum). Wir werden also das Datum der Bewerbungseinreichung an das Ausstellungsdatum des Zeugnisses anpassen.
Daher die nächste MySQL-ähnliche Anweisung:
UPDATE applications a
JOIN (
SELECT ap.id, ab.certificate_issued_at
FROM abiturients ab
JOIN applications ap
ON ab.id = ap.abiturient_id
WHERE ap.documents_taken_at::date < ab.certificate_issued_at
) b
ON a.id = b.id
SET a.documents_taken_at = b.certificate_issued_at;
Wird auf diese Weise PostgreSQL-ähnlich
UPDATE applications a
SET documents_taken_at = b.certificate_issued_at -- we can reference joined table here
FROM abiturients b -- joined table
WHERE
a.abiturient_id = b.id AND -- JOIN ON clause
a.documents_taken_at::date < b.certificate_issued_at -- Subquery WHERE
Wie Sie sehen können, ist die ursprüngliche Subquery JOIN
's ON
Klausel sind zu einer der WHERE
Bedingungen, die durch AND
mit anderen, die ohne Änderungen aus der Unterabfrage verschoben wurden. Und es besteht keine Notwendigkeit mehr für JOIN
Tabelle mit sich selbst (wie in der Subquery).