Tham gia trái của Oracle và các mệnh đề lỗi


10
CREATE TABLE "ATABLE1"
  (
    "COLUMN1" VARCHAR2(20 BYTE),
    "COLUMN2" VARCHAR2(20 BYTE)
  );

CREATE TABLE "ATABLE2"
  (
    "COLUMN1" VARCHAR2(20 BYTE),
    "COLUMN2" VARCHAR2(20 BYTE)
  );

Insert into ATABLE1 (COLUMN1,COLUMN2) values ('A','1');
Insert into ATABLE1 (COLUMN1,COLUMN2) values ('B','2');

Insert into ATABLE2 (COLUMN1,COLUMN2) values ('A',null);
Insert into ATABLE2 (COLUMN1,COLUMN2) values ('A','1');
Insert into ATABLE2 (COLUMN1,COLUMN2) values ('A','2');

select ATABLE1.column1, count(ATABLE2.column1) 
    from ATABLE1 Left OUTER JOIN ATABLE2 on ATABLE1.column1 = atable2.column1
    GROUP BY ATABLE1.column1;

Result

COLUMN1              COUNT(ATABLE2.COLUMN1) 
-------------------- ---------------------- 
A                    3                      
B                    0    

Điều này hoạt động như mong đợi. Có một điều là tôi luôn muốn tất cả các hàng từ ATABLE1 được hiển thị và cũng áp dụng một số hạn chế.

select ATABLE1.column1, count(ATABLE2.column1) 
    from ATABLE1 Left OUTER JOIN ATABLE2 on ATABLE1.column1 = atable2.column1
    where atable2.column2 = '1'
    GROUP BY ATABLE1.column1;


COLUMN1              COUNT(ATABLE2.COLUMN1) 
-------------------- ---------------------- 
A                    1                      

Tại sao tất cả các cột từ ATABLE1 không được hiển thị ngay cả khi tham gia trái? Làm thế nào tôi có thể làm cho chúng xuất hiện?

Cảm ơn rất nhiều trước.


+1, đặc biệt là cho nỗ lực bạn đã bỏ ra để thiết lập các đối tượng thử nghiệm
Jack nói hãy thử topanswers.xyz

"Tại sao tất cả các cột từ ATABLE1 không được hiển thị ngay cả khi tham gia trái?" - ý bạn là nói 'tất cả các hàng'?
Jack nói hãy thử topanswers.xyz

@JackDoumund vâng, điều đó sẽ có ý nghĩa hơn.
Aaron

Câu trả lời:


7

Khi bạn thêm bộ lọc WHERE vào bảng tùy chọn / bên ngoài, sau đó bạn thay đổi truy vấn thành THAM GIA VÀO. Bạn cần thêm điều kiện vào tham gia, hoặc bảng dẫn xuất hoặc CTE.

select ATABLE1.column1, count(ATABLE2.column1) 
    from ATABLE1 Left OUTER JOIN ATABLE2
         on ATABLE1.column1 = atable2.column1 AND atable2.column2 = '1'
    GROUP BY ATABLE1.column1;

3

Tại sao tất cả các cột từ ATABLE1 không được hiển thị ngay cả khi tham gia trái? Làm thế nào tôi có thể làm cho chúng xuất hiện?

Đó là bởi vì bạn đang nói với truy vấn của mình chỉ mang lại ATABLE.column1. Nếu bạn thực hiện truy vấn của gbn hoặc Jack, chỉ cần chỉ ra ATABLE1. * (Hoặc đặt tên cụ thể cho từng truy vấn) trong mệnh đề SELECT của bạn:

select ATABLE1.*, count(ATABLE2.column1) 
from ATABLE1 Left OUTER JOIN ATABLE2
     on ATABLE1.column1 = atable2.column1 AND atable2.column2 = '1'
GROUP BY ATABLE1.column1;

1
Thật thú vị, tôi chắc chắn hy vọng OP không nhầm lẫn về cách liệt kê tất cả các cột. Mặt khác đó là những gì họ yêu cầu. +1.
Leigh Riffel

2

Một cách khác để thêm điều kiện vào phép nối là kiểm tra nulltrong bộ lọc:

select ATABLE1.column1, count(ATABLE2.column1) 
    from ATABLE1 Left OUTER JOIN ATABLE2 on ATABLE1.column1 = atable2.column1
    where atable2.column2 is null or atable2.column2 = '1'
    GROUP BY ATABLE1.column1;

Tôi thích biến thể này nhưng bạn có thể xem nó ít đọc hơn:

select ATABLE1.column1, count(ATABLE2.column1) 
    from ATABLE1 Left OUTER JOIN ATABLE2 on ATABLE1.column1 = atable2.column1
    where decode(atable2.column2,'1',1,null,1,0)=1
    GROUP BY ATABLE1.column1;

Lý do duy nhất để làm điều này là nếu vì một lý do nào đó bạn không thể đặt điều kiện vào bộ lọc (đôi khi là trường hợp trong một truy vấn phức tạp hơn)

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.