2009-03-27 28 views
35

Tôi sử dụng INNER JOIN và LEFT OUTER JOIN mọi lúc. Tuy nhiên, tôi chưa bao giờ có vẻ cần RIGHT OUTER JOINs.Có ai sử dụng kết nối bên ngoài bên phải không?

Tôi đã nhìn thấy rất nhiều SQL tự động tạo khó chịu sử dụng kết nối phù hợp, nhưng với tôi, mã đó là không thể có được đầu của tôi xung quanh. Tôi luôn luôn cần phải viết lại nó bằng cách sử dụng bên trong và bên trái tham gia để làm cho người đứng đầu hoặc đuôi của nó.

Có ai thực sự viết truy vấn bằng cách sử dụng Tham gia phải không?

+0

Related: http: // s tackoverflow.com/questions/436345/when-or-why-would-you-use-a-right-outer-join-instead-of-left – Thilo

Trả lời

25

Điều đó tùy thuộc vào bên tham gia bạn đặt mỗi bảng.

Nếu bạn muốn trả về tất cả các hàng từ bảng bên trái, ngay cả khi không có kết quả phù hợp trong bảng bên phải ... bạn sử dụng kết nối trái.

Nếu bạn muốn trả về tất cả các hàng từ bảng bên phải, ngay cả khi không có kết quả phù hợp trong bảng bên trái, bạn sử dụng kết nối phù hợp.

Điều thú vị là tôi hiếm khi sử dụng các kết nối phù hợp.

+11

Tôi luôn luôn tìm thấy nó hợp lý hơn để bắt đầu với bảng trong đó có tất cả các mục không mồ côi, vì vậy tôi luôn luôn kết thúc bằng cách sử dụng LEFT JOIN là tốt. Tôi tự hỏi nếu đó là một điều văn hóa? –

+5

+1, các khớp nối bên trái và bên phải giống hệt nhau chỉ ngược lại. –

+1

@MatthieuF: Có thể đó là văn hóa. Sử dụng quyền tham gia cảm thấy giống như làm một cái gì đó một cách ngược lại. Nó đến mà không suy nghĩ ít nhất với tôi, để luôn luôn sắp xếp tham gia của tôi trong một cách để (nếu cần thiết) trái tham gia phù hợp với tình hình. Tôi không biết tại sao? :-) – Petros

6

Không, tôi không vì lý do đơn giản tôi có thể thực hiện mọi thứ với các kết nối bên trong hoặc bên trái.

9

Bạn thường sử dụng RIGHT OUTER JOINS để tìm các mục mồ côi trong các bảng khác.

+0

Bạn có thể vui lòng cung cấp thêm chi tiết không? – Shabbyrobe

+0

Kiểm tra bài viết này. http://www.devx.com/dbzone/Article/17403/0/page/5 –

+17

Tôi tìm thấy câu trả lời này làm cho việc gia nhập phù hợp với âm thanh đặc biệt khi không có. Các khớp nối bên trái và bên phải là các hình ảnh phản chiếu của nhau - cả hai đều hữu ích cho việc tìm kiếm các mục mồ côi. Lựa chọn sử dụng đơn giản dựa trên bảng bạn muốn tất cả các hàng từ, ngay cả khi không có kết quả phù hợp. –

1

Thực hành tiêu chuẩn của chúng tôi ở đây là viết mọi thứ về LEFT JOIN nếu có thể. Đôi khi chúng tôi đã sử dụng FULL OUTER JOIN nếu chúng tôi cần, nhưng không bao giờ RIGHT JOINs.

2

Lần duy nhất tôi sử dụng phép nối ngoài bên phải là khi tôi đang làm việc trên truy vấn hiện có và cần thay đổi nó (thường từ bên trong). Tôi có thể đảo ngược việc tham gia và làm cho nó một trái và có lẽ là ok, nhưng tôi cố gắng và giảm số lượng những thứ tôi thay đổi khi tôi sửa đổi mã.

2

Tôi chỉ sử dụng trái, nhưng hãy để tôi nói rằng chúng thực sự giống nhau tùy thuộc vào cách bạn đặt hàng mọi thứ. Tôi đã làm việc với một số người mà chỉ sử dụng quyền, bởi vì họ xây dựng các truy vấn từ trong ra ngoài và thích giữ các mục chính của họ ở phía dưới do đó trong tâm trí của họ nó có ý nghĩa chỉ sử dụng đúng.

I.e.

Got Điều quan trọng ở đây

cần rác hơn

More Junk ngay bên ngoài tham gia chính Stuff

tôi thích để làm công cụ chính sau đó rác ... các công trình bên ngoài Vì vậy, trái cho tôi.

Vì vậy, bất cứ điều gì nổi thuyền của bạn.

1

Bạn có thể thực hiện điều tương tự bằng cách sử dụng kết nối LEFT hoặc RIGHT. Nói chung hầu hết mọi người nghĩ về việc tham gia LEFT có lẽ vì chúng tôi đọc từ trái sang phải. Nó thực sự đi xuống để được nhất quán. Nhóm của bạn nên tập trung vào việc sử dụng tham gia LEFT hoặc RIGHT, chứ không phải cả hai, vì chúng chủ yếu là chính xác, được viết khác nhau.

1

Hiếm khi, như đã nêu, bạn thường có thể sắp xếp lại và sử dụng kết nối bên trái. Ngoài ra tôi tự nhiên có xu hướng đặt hàng dữ liệu, do đó, tham gia trái làm việc để có được những dữ liệu tôi yêu cầu. Tôi nghĩ điều tương tự cũng có thể nói về sự tham gia đầy đủ bên ngoài và chéo, hầu hết mọi người có khuynh hướng tránh xa họ.

24

Để đưa ra một ví dụ trong đó RIGHT JOIN có thể hữu ích.

Giả sử có ba bảng dành cho người, vật nuôi và phụ kiện thú cưng. Mọi người có thể tùy chọn có vật nuôi và những vật nuôi có thể tùy chọn có phụ kiện

CREATE TABLE Persons 
    (
    PersonName VARCHAR(10) PRIMARY KEY 
); 

INSERT INTO Persons 
VALUES  ('Alice'), 
      ('Bob'), 
      ('Charles'); 

CREATE TABLE Pets 
    (
    PetName VARCHAR(10) PRIMARY KEY, 
    PersonName VARCHAR(10) 
); 

INSERT INTO Pets 
VALUES  ('Rover', 
      'Alice'), 
      ('Lassie', 
      'Alice'), 
      ('Fifi', 
      'Charles'); 

CREATE TABLE PetAccessories 
    (
    AccessoryName VARCHAR(10) PRIMARY KEY, 
    PetName  VARCHAR(10) 
); 

INSERT INTO PetAccessories 
VALUES  ('Ball', 'Rover'), 
      ('Bone', 'Rover'), 
      ('Mouse','Fifi'); 

Nếu yêu cầu là để có được một kết quả liệt kê tất cả mọi người không phân biệt có hay không mà họ sở hữu một con vật cưng và thông tin về bất kỳ vật nuôi mà họ sở hữu mà còn có các phụ kiện .

này không hoạt động (Không bao gồm Bob)

SELECT P.PersonName, 
     Pt.PetName, 
     Pa.AccessoryName 
FROM Persons P 
     LEFT JOIN Pets Pt 
     ON P.PersonName = Pt.PersonName 
     INNER JOIN PetAccessories Pa 
     ON Pt.PetName = Pa.PetName; 

này không hoạt động (Bao gồm Lassie)

SELECT P.PersonName, 
     Pt.PetName, 
     Pa.AccessoryName 
FROM Persons P 
     LEFT JOIN Pets Pt 
     ON P.PersonName = Pt.PersonName 
     LEFT JOIN PetAccessories Pa 
     ON Pt.PetName = Pa.PetName; 

này không làm việc (nhưng cú pháp là ít phổ biến hơn vì nó đòi hỏi hai điều khoản ON liên tiếp để đạt được thứ tự hợp lý mong muốn)

SELECT P.PersonName, 
     Pt.PetName, 
     Pa.AccessoryName 
FROM Persons P 
     LEFT JOIN Pets Pt 
        INNER JOIN PetAccessories Pa 
        ON Pt.PetName = Pa.PetName 
     ON P.PersonName = Pt.PersonName; 

Tất cả trong tất cả có lẽ là dễ nhất để sử dụng một RIGHT JOIN

SELECT P.PersonName, 
     Pt.PetName, 
     Pa.AccessoryName 
FROM Pets Pt 
     JOIN PetAccessories Pa 
     ON Pt.PetName = Pa.PetName 
     RIGHT JOIN Persons P 
     ON P.PersonName = Pt.PersonName; 

Mặc dù nếu quyết tâm để tránh điều này tùy chọn khác sẽ được giới thiệu một bảng có nguồn gốc có thể được rời nối với

SELECT P.PersonName, 
     T.PetName, 
     T.AccessoryName 
FROM Persons P 
     LEFT JOIN (SELECT Pt.PetName, 
         Pa.AccessoryName, 
         Pt.PersonName 
        FROM Pets Pt 
         JOIN PetAccessories Pa 
          ON Pt.PetName = Pa.PetName) T 
     ON T.PersonName = P.PersonName; 

SQL Fiddles: MySQL, PostgreSQL, SQL Server

+0

Nếu bạn không hiểu tại sao Bob tội nghiệp bị loại trừ, điều này đã giúp tôi: http: // weblogs.sqlteam.com/jeffs/archive/2007/10/11/mixing-inner-outer-joins-sql.aspx – Luke

+0

@Luke - Thật trùng hợp rằng cả hai chúng tôi đều sử dụng ví dụ "thú cưng"! –

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