SQL Academy · บทเรียน

การเชื่อมตารางเข้ากับตัวเองและชื่อแทน

เชื่อมตารางเข้ากับตัวเองโดยใช้ชื่อแทน เพื่อเปรียบเทียบแถวภายในตารางเดียวกัน (พนักงานกับผู้จัดการ วันที่กับวันที่ก่อนหน้า)

บทเรียน 4 จาก 413 ขั้นตอน

การเชื่อมตารางเข้ากับตัวเองและชื่อแทน เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

Self-Join: การเชื่อมตารางเข้ากับตัวเอง

บางครั้งความสัมพันธ์จะอยู่ภายในตารางเดียว:

  • พนักงาน ↔ ผู้จัดการ โดยผู้จัดการก็เป็นพนักงานคนหนึ่ง
  • ความคิดเห็นแบบกระทู้ โดยแต่ละความคิดเห็นมี parent_id
  • กราฟเพื่อน โดยเชื่อมผู้ใช้กับผู้ใช้

การเตรียมข้อมูล

ตาราง employees ที่มี FK อ้างอิงกลับมายังตารางตัวเอง:

CREATE TABLE employees (
  id BIGSERIAL PRIMARY KEY,
  full_name TEXT NOT NULL,
  manager_id BIGINT REFERENCES employees(id)
);

เชื่อมพนักงานกับผู้จัดการของพวกเขา

กำหนดชื่อแทนที่แตกต่างกันให้แต่ละอินสแตนซ์:

SELECT e.full_name AS employee, m.full_name AS manager
FROM employees e
JOIN employees m ON m.id = e.manager_id;

หากไม่มีชื่อแทน คำสั่งจะคอมไพล์ไม่ได้

หากไม่มีชื่อแทน คุณจะไม่สามารถบอกได้ว่าหมายถึง full_name ใด การอ้างอิงทุกครั้งจึงกำกวม:

-- ERROR: column reference "full_name" is ambiguous
SELECT full_name FROM employees JOIN employees ON ...

ใช้ LEFT JOIN สำหรับพนักงานระดับบนสุด

การเชื่อมแบบ INNER จะตัดพนักงานที่ไม่มีผู้จัดการออก เช่น CEO ให้ใช้ LEFT JOIN เพื่อเก็บพนักงานเหล่านั้นไว้:

SELECT e.full_name AS employee, m.full_name AS manager
FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;

ความคิดเห็นแบบกระทู้

แสดงแต่ละความคิดเห็นพร้อมข้อความของความคิดเห็นแม่:

SELECT c.id, c.body, p.body AS parent_body
FROM comments c
LEFT JOIN comments p ON p.id = c.parent_id;

คู่และชุดผสม

ค้นหาคู่ผลิตภัณฑ์ที่ปรากฏในคำสั่งซื้อเดียวกัน โดยไม่ให้เกิดคู่ซ้ำแบบ (A,B) และ (B,A):

SELECT a.id AS product_a, b.id AS product_b
FROM order_items a
JOIN order_items b
  ON a.order_id = b.order_id
 AND a.product_id < b.product_id;

เปรียบเทียบแถวที่อยู่ติดกัน

ใช้ self-join กับเวอร์ชันก่อนหน้าของแถว:

SELECT a.id, a.created_at, b.created_at AS prev_at
FROM events a
LEFT JOIN events b ON b.id = a.previous_id;

Self-Join เทียบกับฟังก์ชันหน้าต่าง

สำหรับงานจำนวนมากที่ต้องเปรียบเทียบแต่ละแถวกับแถวก่อนหน้า ฟังก์ชันหน้าต่าง (LAG) จะเรียบง่ายและรวดเร็วกว่าการใช้ self-join โดยมีรายละเอียดในบทเจาะลึกฟังก์ชันหน้าต่าง

Self-Join แบบเรียกซ้ำ

หากต้องเดินลงไปลึก N ระดับ เช่น ผังองค์กรหรือต้นไม้ความคิดเห็น ให้ใช้ CTE แบบเรียกซ้ำ ซึ่งจะอธิบายไว้ในบทคำสั่งสอบถามย่อยและ CTE

การสร้างดัชนีบนคอลัมน์ FK

เพิ่มดัชนีบนคอลัมน์ FK ที่อ้างอิงกลับมายังตารางตัวเองเสมอ หากไม่มีดัชนี การเชื่อมจะต้องสแกนทั้งตารางทุกครั้งที่ค้นหาข้อมูลของแถวแม่

CREATE INDEX employees_manager_idx ON employees(manager_id);

สรุปทบทวน

การ JOIN ตารางกับตัวเองช่วยจัดการความสัมพันธ์ภายในตารางเดียว

  • ใช้นามแฝงสองชื่อสำหรับสำเนาเสมือนสองชุด
  • ใช้ LEFT JOIN เพื่อคงโหนดราก / แถวระดับบนสุดไว้
  • สร้างดัชนีให้คอลัมน์ FK
  • ฟังก์ชันหน้าต่างช่วยทำรูปแบบ "แถวก่อนหน้า" ให้ง่ายขึ้น

ตรวจสอบความเข้าใจ

คุณ JOIN ตาราง employees เข้ากับตัวเองเพื่อค้นหาผู้จัดการของพนักงานแต่ละคน เหตุใดจึงต้องใช้นามแฝง

เริ่มต้นได้ฟรี

เรียนรู้ SQL ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
46
บทเรียน
183

คำถามที่พบบ่อย

บทเรียน “การเชื่อมตารางเข้ากับตัวเองและชื่อแทน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเชื่อมตารางเข้ากับตัวเองและชื่อแทน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเชื่อมตารางเข้ากับตัวเองและชื่อแทน”

เชื่อมตารางเข้ากับตัวเองโดยใช้ชื่อแทน เพื่อเปรียบเทียบแถวภายในตารางเดียวกัน (พนักงานกับผู้จัดการ วันที่กับวันที่ก่อนหน้า) คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การเชื่อมตารางเข้ากับตัวเองและชื่อแทน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. เหตุใดจึงต้องใช้การเชื่อมตาราง (ทบทวนโมเดลเชิงสัมพันธ์)
  2. กลไกของ INNER JOIN
  3. LEFT/RIGHT JOIN และการเชื่อมตาราง OUTER
  4. การเชื่อมตารางเข้ากับตัวเองและชื่อแทน
← กลับไปที่ SQL Academy