Lewe przyłączenie Oracle i błędy klauzul

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    

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ę.

Rafa de Castro
źródło
+1, szczególnie za wysiłek włożony w konfigurowanie obiektów testowych
Jack mówi, spróbuj wypróbować topanswers.xyz
„Dlaczego nie są wyświetlane wszystkie kolumny z ATABLE1, nawet z lewym złączeniem?” - Czy chciałeś powiedzieć „wszystkie rzędy”?
Jack mówi, że spróbuj topanswers.xyz
@JackDouglas tak, to miałoby większy sens.
Aaron,

Odpowiedzi:

7

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.

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
źródło
3

Dlaczego nie są wyświetlane wszystkie kolumny z ATABLE1, nawet z lewym złączeniem? Jak mogę je wyświetlić?

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:

select ATABLE1.*, count(ATABLE2.column1) 
from ATABLE1 Left OUTER JOIN ATABLE2
     on ATABLE1.column1 = atable2.column1 AND atable2.column2 = '1'
GROUP BY ATABLE1.column1;
Aaron
źródło
1
Co ciekawe, mam nadzieję, że OP nie jest zdezorientowany, jak wyświetlić wszystkie kolumny. Z drugiej strony o to pytali. +1.
Leigh Riffel,
2

Alternatywą dla dodania warunku do złączenia jest przetestowanie nullw filtrze:

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;

Wolę ten wariant, ale możesz uznać go za mniej czytelny:

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;

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)

Jack mówi, że spróbuj topanswers.xyz
źródło