Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle- Kết nối bên ngoài bên trái trên nhiều bảng không trả về giá trị null mong muốn

Bạn cần hiểu rõ hơn về cách thức hoạt động của LEFT JOIN (liên kết bên ngoài nói chung - liên kết trái / phải và toàn bộ [bên ngoài])

LEFT JOIN luôn được thực hiện theo hai bước:

SELECT ....
FROM table1
LEFT JOIN table1 ON join_conditions
WHERE where_conditions

Bước 1 - LEFT JOIN được thực hiện trước (sử dụng các điều kiện được chỉ định trong mệnh đề ON để nối hai bảng)
Bước 2 - các điều kiện WHERE được áp dụng cho tập hợp lại được tạo bởi phép nối ở bước 1

> Cách hoạt động của LEFT JOIN - một lời nhắc nhanh:LEFT JOIN luôn trả về TẤT CẢ các hàng từ bảng bên trái, ngay cả những hàng này không có sự trùng khớp nào trong bảng bên phải. Khi không có kết quả phù hợp (điều kiện BẬT đánh giá là sai), LEFT JOIN trả về NULL cho bảng bên phải.
RIGHT JOIN hoạt động theo cách tương tự, nhưng nó trả về tất cả các hàng từ bảng RIGHT, không phải hàng bên trái với tư cách THAM GIA TRÁI.

VẬY nếu bạn có truy vấn này:

SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS 
FROM source_table S 
LEFT JOIN HISTORY H
ON S.TABLE_ID=H.TABLE_ID
WHERE H.STATUS='COMPLETED'

cơ sở dữ liệu đầu tiên thực hiện LEFT JOIN, nghĩa là:

SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS 
FROM source_table S 
LEFT JOIN HISTORY H
ON S.TABLE_ID=H.TABLE_ID

Truy vấn trên cho kết quả sau (lưu ý NULL trong 3 hàng cuối cùng ở phía thứ hai):

|   S.GROUP | S.TABLE_ID |                 H.RUN_DATE |  H.STATUS |
|-----------|------------|----------------------------|-----------|
|     Sales |       1210 |  January, 05 2016 00:00:00 | COMPLETED |
|     Sales |       1210 | February, 05 2016 00:00:00 | COMPLETED |
| Reference |       1211 | February, 05 2016 00:00:00 | COMPLETED |
| Reference |       1211 |    March, 05 2016 00:00:00 | COMPLETED |
| Marketing |       1230 |  January, 05 2016 00:00:00 | COMPLETED |
| Marketing |       1230 |    March, 05 2016 00:00:00 | COMPLETED |
|     Sales |       1245 |                     (null) |    (null) |
| Reference |       1650 |                     (null) |    (null) |
|     Sales |       1784 |                     (null) |    (null) |

Và sau đó cơ sở dữ liệu thực hiện điều kiện WHERE trên tập kết quả ở trên:

WHERE H.STATUS='COMPLETED'

Kể từ khi NULL='COMPLETED' đánh giá là FALSE, khi đó kết quả cuối cùng của truy vấn là:

|     GROUP | TABLE_ID |                   RUN_DATE |    STATUS |
|-----------|----------|----------------------------|-----------|
|     Sales |     1210 |  January, 05 2016 00:00:00 | COMPLETED |
|     Sales |     1210 | February, 05 2016 00:00:00 | COMPLETED |
| Reference |     1211 | February, 05 2016 00:00:00 | COMPLETED |
| Reference |     1211 |    March, 05 2016 00:00:00 | COMPLETED |
| Marketing |     1230 |  January, 05 2016 00:00:00 | COMPLETED |
| Marketing |     1230 |    March, 05 2016 00:00:00 | COMPLETED |

nghĩa là:tất cả NULL đã bị bỏ qua.
Xem bản trình diễn này: http:// sqlfiddle .com / #! 9 / e2ed0 / 3

Nếu bạn cũng muốn nhận các bản ghi có giá trị NULL, bạn cần thay đổi điều kiện này thành:

WHERE ( H.STATUS='COMPLETED' OR H.STATUS IS NULL )

bạn cũng có thể xóa điều kiện ths khỏi mệnh đề WHERE và thêm nó vào điều kiện BẬT của LEFT JOIN, nghĩa là:

SELECT S.GROUP,S.TABLE_ID,H.RUN_DATE,H.STATUS 
FROM source_table S 
LEFT JOIN HISTORY H
ON ( S.TABLE_ID=H.TABLE_ID AND H.STATUS='COMPLETED' )

xem truy vấn cuối cùng trong bản trình diễn này: http://sqlfiddle.com/#!9/e2ed0 / 3




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách di chuyển tệp từ thư mục này sang thư mục khác bằng PL SQL

  2. Xóa rất nhiều dữ liệu trong Oracle

  3. API cơ sở dữ liệu:Cách đối phó với điều kiện multi where trong Python

  4. Oracle và Left Outer Tham gia

  5. Tôi nên diễn giải Chọn bí danh riêng biệtRefForMe.field1 Từ [email bảo vệ] bí danhRefForMe