SQL Academy · บทเรียน

การเชื่อมแบบ Lateral (LATERAL JOIN)

อ้างอิงรายการ FROM ก่อนหน้าจากภายในคำค้นย่อยด้วย LATERAL — เทียบเท่ากับการเรียกฟังก์ชันแยกสำหรับแต่ละแถวใน SQL

บทเรียน 2 จาก 414 ขั้นตอน

การเชื่อมแบบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเชื่อมแบบ Cross และผลคูณคาร์ทีเซียน
  2. การเชื่อมแบบ Lateral (LATERAL JOIN)
  3. การเชื่อมแบบตัดออกและกึ่งเชื่อม (NOT EXISTS)
  4. การปรับประสิทธิภาพการเชื่อมหลายตาราง
← กลับไปที่ SQL Academy