2010-07-29 48 views

Trả lời

125

Bạn sử dụng tự tham gia khi bảng tham chiếu dữ liệu trong chính nó.

Ví dụ: bảng Employee có thể có cột SupervisorID trỏ đến nhân viên là sếp của nhân viên hiện tại.

Để truy vấn dữ liệu và thu thập thông tin cho cả hai người trong một dòng, bạn tự có thể tham gia như thế này:

select e1.EmployeeID, 
    e1.FirstName, 
    e1.LastName, 
    e1.SupervisorID, 
    e2.FirstName as SupervisorFirstName, 
    e2.LastName as SupervisorLastName 
from Employee e1 
left outer join Employee e2 on e1.SupervisorID = e2.EmployeeID 
+0

Điều đó có vẻ như tự bên ngoài tham gia với tôi? –

+2

@JoeCaruso Đó là vì nó là;) – RedFilter

+2

Tôi tự hỏi tại sao không ai nhấn mạnh phần "trong cùng một hàng". Đó không phải là toàn bộ quan điểm của việc tự tham gia? –

14

Một tự tham gia chỉ đơn giản là khi bạn tham gia một bảng với chính nó. Không có từ khóa SELF JOIN, bạn chỉ cần viết một kết nối thông thường trong đó cả hai bảng tham gia vào liên kết là cùng một bảng. Một điều cần lưu ý là khi bạn đang tự tham gia nó là cần thiết để sử dụng một bí danh cho bảng nếu không tên bảng sẽ không rõ ràng.

Điều này rất hữu ích khi bạn muốn tương quan các cặp hàng từ cùng một bảng, ví dụ như mối quan hệ cha - con. Truy vấn sau trả về tên của tất cả các danh mục con ngay lập tức của danh mục 'Nhà bếp'.

SELECT T2.name 
FROM category T1 
JOIN category T2 
ON T2.parent = T1.id 
WHERE T1.name = 'Kitchen' 
+0

Rất vui được xem nhận xét này .. TRÊN T2.parent = T1.id (vì nó ảnh hưởng đến kết quả nếu chúng ta trao đổi 'cha mẹ' và 'id' trong nó) – himanshupareek66

+0

Tốt đề cập đến không có từ khóa 'SELF JOIN'. Tôi đã nhầm lẫn về phần đó! – nclsvh

6

Bạn muốn sử dụng tự tham gia trên bảng "tự giới thiệu" - ví dụ: một bảng các nhân viên trong đó managerid là một khóa ngoại để nhân viên trên cùng một bảng đó.

Ví dụ:

SELECT E.name, ME.name AS manager 
FROM dbo.Employees E 
LEFT JOIN dbo.Employees ME 
ON ME.employeeid = E.managerid 
+0

ON ME.employeeid = E.managerid sẽ tạo kết quả khác thay vì ON ME.managerid = E.employeeid – himanshupareek66

12

SQL tự tham gia chỉ đơn giản là một bình thường tham gia được sử dụng để tham gia vào một bảng với chính nó.

Ví dụ:

Select * 
FROM Table t1, Table t2 
WHERE t1.Id = t2.ID 
+16

Sẽ không an toàn hơn khi sử dụng 'SELECT t1. *' Để tránh trùng lặp các tên cột trong kết quả? – Matthieu

41

Vâng, một ví dụ điển hình là nơi bạn muốn để có được một danh sách các nhân viên và cán bộ quản lý trực tiếp của mình:

select e.employee as employee, b.employee as boss 
from emptable e, emptable b 
where e.manager_id = b.empolyee_id 
order by 1 

Đó là cơ bản sử dụng khi có bất kỳ mối quan hệ giữa các hàng được lưu trữ trong cùng một bảng.

  • nhân viên.
  • tiếp thị đa cấp.
  • các bộ phận máy.

Và cứ thế ...

+7

Boo cho cú pháp không phải ANSI và sử dụng thứ tự trong mệnh đề 'ORDER BY' thay vì tên cột. – RedFilter

+14

Boo quay lại ngay với bạn vì thiếu điểm của câu trả lời :-) Tôi có xu hướng sử dụng cú pháp đơn giản nhất hoạt động vì DBMS tốt 'sẽ không để điều đó ảnh hưởng đến hiệu suất. – paxdiablo

+0

câu trả lời hay nhất cho đến nay ... :) –

Các vấn đề liên quan