การเชื่อมแบบ Lateral (LATERAL JOIN)
อ้างอิงรายการ FROM ก่อนหน้าจากภายในคำค้นย่อยด้วย LATERAL — เทียบเท่ากับการเรียกฟังก์ชันแยกสำหรับแต่ละแถวใน SQL
การเชื่อมแบบ Lateral (LATERAL JOIN) เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
LATERAL คืออะไร
LATERAL อนุญาตให้คำค้นย่อยในส่วนคำสั่ง FROM อ้างอิงคอลัมน์จากรายการที่อยู่ก่อนหน้าในรายการ FROM ได้ หากไม่มี LATERAL รายการใน FROM จะมองเห็นกันเองไม่ได้
แบบจำลองทางความคิด
LATERAL หมายถึง "สำหรับแต่ละแถวของด้านซ้าย ให้ประเมินคำค้นนี้" ลักษณะคล้ายคำค้นย่อยที่สัมพันธ์กับแถวภายนอก แต่ใช้ในส่วนคำสั่ง FROM และคืนค่าได้หลายแถวหรือหลายคอลัมน์
คำสั่งซื้อ 3 อันดับแรกต่อผู้ใช้
กรณีใช้งาน LATERAL แบบคลาสสิก:
SELECT u.id, u.email, o.id AS order_id, o.total
FROM users u
JOIN LATERAL (
SELECT id, total FROM orders
WHERE user_id = u.id
ORDER BY total DESC
LIMIT 3
) AS o ON true;เหตุใดจึงไม่ใช้คำค้นย่อยใน SELECT
คำค้นย่อยแบบสเกลาร์ใน SELECT คืนค่าได้หนึ่งค่า ส่วน LATERAL คืนค่าได้หลายแถวและหลายคอลัมน์ต่อแถวภายนอก
LATERAL กับฟังก์ชัน
ฟังก์ชันที่คืนค่าเป็นชุดจะมีลักษณะเป็น LATERAL โดยค่าเริ่มต้น:
SELECT t.id, unnest_tag
FROM posts t
CROSS JOIN LATERAL unnest(t.tags) AS unnest_tag;
-- Equivalent (set-returning functions are implicit LATERAL):
SELECT t.id, unnest_tag
FROM posts t, unnest(t.tags) AS unnest_tag;LATERAL เทียบกับฟังก์ชันหน้าต่าง
สำหรับ "N อันดับแรกต่อกลุ่ม" ทั้ง LATERAL และ ROW_NUMBER ต่างก็ใช้ได้ โดยทั่วไป ROW_NUMBER มีประสิทธิภาพมากกว่าเพราะอ่านตารางเพียงครั้งเดียว ส่วน LATERAL จะเรียกคำค้นใหม่สำหรับแต่ละแถวภายนอก
-- ROW_NUMBER alternative:
WITH ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY total DESC) AS rn
FROM orders
)
SELECT u.email, r.id, r.total
FROM users u
JOIN ranked r ON r.user_id = u.id
WHERE r.rn <= 3;LATERAL กับฟังก์ชันรวม
ค่าที่คำนวณล่วงหน้าสำหรับแต่ละแถว:
SELECT u.email, stats.last_order_at, stats.total_orders
FROM users u
LEFT JOIN LATERAL (
SELECT MAX(created_at) AS last_order_at,
COUNT(*) AS total_orders
FROM orders WHERE user_id = u.id
) AS stats ON true;ON true
LATERAL ต้องมีส่วนคำสั่ง ON เมื่อใช้ JOIN แต่เงื่อนไข JOIN อยู่ภายในคำค้นย่อย ดังนั้น ON ด้านนอกจึงเป็น true
CROSS JOIN LATERAL เทียบกับ LEFT JOIN LATERAL
- CROSS JOIN LATERAL — ตัดแถวด้านนอกออกหากด้านในไม่คืนแถวใด ๆ
- LEFT JOIN LATERAL ... ON true — เก็บแถวด้านนอกไว้ โดยคอลัมน์ด้านในเป็น NULL
LATERAL สำหรับคำค้นหาระยะทาง
สำหรับผู้ใช้แต่ละคน ให้หาร้านค้าที่อยู่ใกล้ที่สุด:
SELECT u.id, s.name, s.distance
FROM users u
CROSS JOIN LATERAL (
SELECT name, location <-> u.location AS distance
FROM stores
ORDER BY location <-> u.location
LIMIT 1
) AS s;LATERAL เป็นมาตรฐาน SQL
ได้รับการกำหนดเป็นมาตรฐานใน SQL:1999 PostgreSQL ใช้ LATERAL ส่วน SQL Server ใช้ CROSS APPLY / OUTER APPLY
ประสิทธิภาพ
LATERAL ทำงานแยกกันสำหรับแต่ละแถวภายนอก หากตารางด้านในมีดัชนีที่เหมาะสม การทำงานแต่ละรอบจะรวดเร็ว หากไม่มีดัชนี การทำงานในข้อมูลขนาดใหญ่อาจช้า
สรุป
LATERAL = "คำค้นย่อยใน FROM ที่มองเห็นแถวภายนอก"
- N อันดับแรกต่อกลุ่ม
- การคำนวณล่วงหน้าต่อแถว
- ฟังก์ชันที่คืนค่าเป็นชุด
- ใช้คู่กับ LEFT JOIN ... ON true สำหรับ outer join
ตรวจสอบความเข้าใจ
LATERAL เปิดให้ทำสิ่งใดได้บ้างที่คำค้นย่อยใน FROM ทั่วไปทำไม่ได้
เรียนรู้ SQL ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 46
- บทเรียน
- 183
คำถามที่พบบ่อย
บทเรียน “การเชื่อมแบบ Lateral (LATERAL JOIN)” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเชื่อมแบบ Lateral (LATERAL JOIN)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเชื่อมแบบ Lateral (LATERAL JOIN)”
อ้างอิงรายการ FROM ก่อนหน้าจากภายในคำค้นย่อยด้วย LATERAL — เทียบเท่ากับการเรียกฟังก์ชันแยกสำหรับแต่ละแถวใน SQL คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การเชื่อมแบบ Lateral (LATERAL JOIN)” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเชื่อมแบบ Cross และผลคูณคาร์ทีเซียน
- การเชื่อมแบบ Lateral (LATERAL JOIN)
- การเชื่อมแบบตัดออกและกึ่งเชื่อม (NOT EXISTS)
- การปรับประสิทธิภาพการเชื่อมหลายตาราง