Ưu tiên SQL ANSI THAM GIA


7

Tôi có một truy vấn giống như thế này:

    SELECT *
      FROM TBLA A
 LEFT JOIN TBLB B ON A.Col1 = B.Col2
RIGHT JOIN TBLC C ON B.Col3 = C.Col4
      JOIN TBLD D ON C.Col5 = D.Col6

Theo thứ tự các tham gia sẽ được giải quyết? Tôi quan tâm nhất đến SQL Server và sẽ đánh dấu một lời giải thích cho nó là câu trả lời, nhưng cũng quan tâm không kém đến tiêu chuẩn ANSI / ISO và cách nó hoạt động trong các RDBMS khác nhau.

Lý do cho câu hỏi này là để tìm hiểu tại sao kết quả khác với truy vấn này

    SELECT *
      FROM TBLA A
CROSS JOIN TBLC C
 LEFT JOIN TBLB B ON A.Col1 = B.Col2 AND B.Col3 = C.Col4
      JOIN TBLD D ON C.Col5 = D.Col6

CROSS THAM GIA TBLC C trong truy vấn thứ hai của bạn rất khác với RIGHT THAM GIA TBLC C trong truy vấn đầu tiên của bạn. Điều đó một mình là một sự khác biệt rất lớn.
AK

1
Trộn LEFTRIGHT JOINtrong cùng một truy vấn đang cầu xin sự nhầm lẫn, IMHO.
Jon của tất cả các giao dịch

Câu trả lời:


8

Về mặt logic, các phép nối được giải quyết theo thứ tự các ONmệnh đề từ trái sang phải.

Đầu ra của mỗi phép nối là một bảng ảo đi vào phép nối tiếp theo.

Vì vậy, đối với truy vấn trong câu hỏi của bạn, kết quả bảng ảo A LJ Bsau đó được nối ngay vào C. Điều kiện nối B.Col3 = C.Col4sẽ mất bất kỳ hàng mở rộng null nào được bảo toàn bởi liên kết bên trái ban đầu có hiệu quả biến liên kết đầu tiên trở lại tham gia bên trong và bảng ảo kết quả (bảo tồn tất cả các hàng từ đó C) sau đó được nối bên trong D.

Vì vậy, truy vấn ban đầu của bạn có thể được đơn giản hóa như

SELECT *
FROM TBLA A
INNER JOIN TBLB B ON A.Col1 = B.Col2
RIGHT JOIN TBLC C ON B.Col3 = C.Col4
      JOIN TBLD D ON C.Col5 = D.Col6

Đó là hiệu quả tương tự như (A IJ B) ROJ (C IJ D)

Thứ tự của các ONmệnh đề không nhất thiết giống như thứ tự các bảng xuất hiện trong truy vấn. Điều này cũng có thể được viết lại như(C IJ D) LOJ (A IJ B)

SELECT *
FROM   TBLC C
       INNER JOIN TBLD D
         ON C.Col5 = D.Col6
       LEFT JOIN TBLA A
                 INNER JOIN TBLB B
                   ON A.Col1 = B.Col2
         ON B.Col3 = C.Col4 

Vị trí của các mệnh đề trên có nghĩa là phép nối ngoài được thực hiện giữa hai bảng ảo kết quả từ (C IJ D)(A IJ B)thay vì chỉ trên một bảng duy nhất.

Trong truy vấn thứ hai của bạn về mặt khái niệm, bảng ảo A x Cđược nối vào B bảo toàn toàn bộ sản phẩm cartesian, sau đó kết quả của nó được nối Dvới vị từ C.Col5 = D.Col6. Điều này giúp loại bỏ bất kỳ hàng nào khỏi kết quả cuối cùng không tham gia bên trong giữa CDcó nghĩa là nó tương đương với

SELECT *
FROM   TBLC C
       JOIN TBLD D
         ON C.Col5 = D.Col6
       CROSS JOIN TBLA A
       LEFT JOIN TBLB B
         ON A.Col1 = B.Col2
            AND B.Col3 = C.Col4 

Tôi không chắc chắn rằng cái đầu tiên là (A IJ B) ROJ (C IJ D). Tôi nghĩ đó là ((A IJ B) ROJ C) IJ D).
ypercubeᵀᴹ

Hai phiên bản này là tương đương trong kết quả nhưng không tổng hợp.
ypercubeᵀᴹ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.