Позвольте мне объяснить немного больше на моем примере.
Задача: исправить информацию, когда абитуриенты (учащиеся, которые собираются покинуть среднюю школу) подали заявки в университет раньше, чем получили школьные сертификаты (да, они получили сертификаты раньше, чем были выданы (к указанной дате сертификата). Итак, мы будем увеличить дату подачи заявки, чтобы она соответствовала дате выдачи сертификата.
Таким образом. следующее MySQL-подобное утверждение:
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;
Таким образом, становится PostgreSQL-подобным
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
Как вы можете видеть, оригинальный подзапрос JOIN
«s ON
положение стало одним из WHERE
условий, которое conjucted путем AND
с другими, которые были перемещены из подзапроса без каких - либо изменений. И больше нет необходимости JOIN
объединяться с самим собой (как это было в подзапросе).