ให้ฉันอธิบายอีกหน่อยโดยตัวอย่างของฉัน
ภารกิจ: ข้อมูลที่ถูกต้องซึ่งผู้ที่ถูกทารุณกรรม (นักเรียนกำลังจะออกจากโรงเรียนมัธยม) ได้ส่งใบสมัครไปยังมหาวิทยาลัยเร็วกว่าที่พวกเขาได้รับใบรับรองโรงเรียน (ใช่พวกเขาได้รับใบรับรองเร็วกว่าที่พวกเขาออก (ตามวันที่ระบุใบรับรอง) ดังนั้นเราจะ เพิ่มวันที่ส่งใบสมัครให้พอดีกับวันที่ออกใบรับรอง
ดังนั้น. คำสั่งคล้าย 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
ได้ON
ประโยคย่อยของแบบสอบถามดั้งเดิมได้กลายเป็นหนึ่งในWHERE
เงื่อนไขที่ได้รับความสนใจจากAND
ผู้อื่นซึ่งถูกย้ายจากแบบสอบถามย่อยโดยไม่มีการเปลี่ยนแปลง และไม่จำเป็นต้องต่อJOIN
โต๊ะกับตัวเองอีกต่อไป (เหมือนเดิมในแบบสอบถามย่อย)