2013-04-08 25 views

Trả lời

10

TABLE C will left join into 1. (TABLE B) or 2. (data from TABLE A LEFT JOIN TABLE B) or 3. (TABLE A)?

Thứ hai. Nhưng The codition tham gia sẽ giúp bạn hiểu thêm.

Bạn có thể viết:

SELECT * 
FROM Table A 
LEFT JOIN TABLE B ON (A.id = B.id) 
LEFT JOIN TABLE C ON (A.ID = C.ID) 

Nhưng bạn có thể:

SELECT * 
FROM Table A 
LEFT JOIN TABLE B ON (A.id = B.id) 
LEFT JOIN TABLE C ON (A.id = C.id and B.code = C.code) 

Vì vậy, bạn có thể tham gia vào mọi lĩnh vực từ các bảng trước đó và bạn tham gia vào "kết quả" (mặc dù động cơ có thể chọn cách của nó để có được kết quả) của các kết nối trước đó.

Hãy suy nghĩ khi tham gia trái khi hoạt động không giao hoán (A left join B không giống như B left jon A) Vì vậy, thứ tự quan trọng và C sẽ được nối lại tại các bảng đã tham gia trước đó.

4

Các Oracle documentation là khá cụ thể về cách thức tham gia được xử lý:

To execute a join of three or more tables, Oracle first joins two of the tables based on the join conditions comparing their columns and then joins the result to another table based on join conditions containing columns of the joined tables and the new table. Oracle continues this process until all tables are joined into the result.

Đây là phương pháp logic để xử lý tham gia và phù hợp với các tiêu chuẩn ANSI (nói cách khác, tất cả các quá trình cơ sở dữ liệu các tham gia theo thứ tự).

Tuy nhiên, khi truy vấn thực sự là được thực hiện, trình tối ưu hóa có thể chọn chạy các kết nối theo thứ tự khác. Kết quả cần phải hợp lý giống như xử lý các phép nối theo thứ tự được đưa ra trong truy vấn.

Ngoài ra, điều kiện kết hợp có thể gây ra một số điều kiện bất ngờ phát sinh. Vì vậy, nếu bạn có:

from A left outer join 
    B 
    on A.id = B.id left outer join 
    C 
    on B.id = C.id 

Sau đó, bạn có thể có điều kiện nơi AC từng có một hàng với một id cụ thể, nhưng B không. Với công thức này, bạn sẽ không thấy hàng trong C vì nó đang tham gia NULL. Vì vậy, hãy cẩn thận với các điều kiện tham gia trên left outer join, đặc biệt khi tham gia vào một bảng khác với bảng đầu tiên trong chuỗi.

+0

Lưu ý trễ: Một biến thể về điều này là "biến đổi ngôi sao", trong đó một tập hợp các vị từ được áp dụng cho bảng thực tế theo suy luận từ các phép nối được chỉ định vào bảng thứ nguyên và áp dụng cho nó trước khi tham gia trở lại kích thước. –

1

Bạn cần đề cập tên cột đúng cách để chạy truy vấn. Chúng ta hãy nói nếu bạn đang sử dụng:

SELECT * 
FROM Table A 
LEFT JOIN TABLE B ON (A.id = B.id) 
LEFT JOIN TABLE C ON (A.id = C.id and B.code = C.code) 

Sau đó, bạn có thể nhận được lỗi sau:

ORA-00933:SQL command not properly ended.

Vì vậy, để tránh nó, bạn có thể thử:

Cảm ơn

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