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
Ini berfungsi seperti yang diharapkan. Masalahnya adalah saya selalu ingin semua baris dari ATABLE1 ditampilkan dan juga menerapkan beberapa batasan.
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
Mengapa tidak semua kolom dari ATABLE1 ditampilkan bahkan dengan join kiri? Bagaimana saya bisa membuatnya muncul?
Terima kasih banyak sebelumnya.
Jawaban:
Saat Anda menambahkan filter WHERE ke tabel opsional / luar, maka Anda mengubah kueri menjadi INNER JOIN. Anda perlu menambahkan kondisi ke dalam gabungan, atau tabel turunan, atau CTE.
sumber
Itu karena Anda memberi tahu kueri Anda untuk hanya mengembalikan ATABLE.column1. Jika Anda menerima permintaan gbn atau Jack, cukup tunjukkan ATABLE1. * (Atau sebutkan masing-masing) di klausa SELECT Anda:
sumber
Alternatif untuk menambahkan kondisi ke gabungan adalah dengan menguji
null
di filter:Saya lebih suka varian ini tetapi Anda mungkin menganggapnya kurang mudah dibaca:
Satu-satunya alasan untuk melakukan ini adalah jika karena alasan tertentu Anda tidak dapat memasukkan kondisi dalam filter (yang terkadang merupakan kasus dalam kueri yang lebih kompleks)
sumber