Oracle kiri bergabung dan di mana klausa kesalahan

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    

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.

Rafa de Castro
sumber
+1, terutama untuk upaya yang telah Anda lakukan untuk menyiapkan objek uji
Jack mengatakan coba topanswers.xyz
"Mengapa tidak semua kolom dari ATABLE1 ditampilkan bahkan dengan join kiri?" - Apakah Anda bermaksud mengatakan 'semua baris'?
Jack bilang coba topanswers.xyz
@ JackDouglas ya, itu akan lebih masuk akal.
Aaron

Jawaban:

7

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.

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;
gbn
sumber
3

Mengapa tidak semua kolom dari ATABLE1 ditampilkan bahkan dengan join kiri? Bagaimana saya bisa membuatnya muncul?

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:

select ATABLE1.*, count(ATABLE2.column1) 
from ATABLE1 Left OUTER JOIN ATABLE2
     on ATABLE1.column1 = atable2.column1 AND atable2.column2 = '1'
GROUP BY ATABLE1.column1;
Harun
sumber
1
Menarik, saya harap OP tidak bingung bagaimana cara mendaftar semua kolom. Di sisi lain itulah yang mereka tanyakan. +1.
Leigh Riffel
2

Alternatif untuk menambahkan kondisi ke gabungan adalah dengan menguji nulldi filter:

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;

Saya lebih suka varian ini tetapi Anda mungkin menganggapnya kurang mudah dibaca:

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;

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)

Jack mengatakan coba topanswers.xyz
sumber