การเชื่อมตารางเข้ากับตัวเองและชื่อแทน
เชื่อมตารางเข้ากับตัวเองโดยใช้ชื่อแทน เพื่อเปรียบเทียบแถวภายในตารางเดียวกัน (พนักงานกับผู้จัดการ วันที่กับวันที่ก่อนหน้า)
การเชื่อมตารางเข้ากับตัวเองและชื่อแทน เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุใดจึงต้องใช้การเชื่อมตาราง (ทบทวนโมเดลเชิงสัมพันธ์)
- กลไกของ INNER JOIN
- LEFT/RIGHT JOIN และการเชื่อมตาราง OUTER
- การเชื่อมตารางเข้ากับตัวเองและชื่อแทน