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
Działa to zgodnie z oczekiwaniami. Chodzi o to, że zawsze chcę, aby wszystkie wiersze z ATABLE1 były wyświetlane, a także stosować pewne ograniczenia.
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
Dlaczego nie są wyświetlane wszystkie kolumny z ATABLE1, nawet z lewym złączeniem? Jak mogę je wyświetlić?
Z góry dziękuję.
Odpowiedzi:
Po dodaniu filtrów WHERE do opcjonalnej / zewnętrznej tabeli zmienisz zapytanie na INNER JOIN. Musisz dodać warunek do złączenia, tabeli pochodnej lub CTE.
źródło
To dlatego, że mówisz swojemu zapytaniu, aby przywróciło tylko ATABLE.column1. Jeśli bierzesz zapytania gbn lub Jacka, po prostu wpisz ATABLE1. * (Lub konkretnie nazwij każde z nich) w klauzuli SELECT:
źródło
Alternatywą dla dodania warunku do złączenia jest przetestowanie
null
w filtrze:Wolę ten wariant, ale możesz uznać go za mniej czytelny:
Jedynym powodem jest to, że z jakiegoś powodu nie można umieścić warunku w filtrze (co czasami bywa w przypadku bardziej złożonego zapytania)
źródło