Oracle lasciato a sinistra e dove clausole errori


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    

Funziona come previsto. Il fatto è che voglio sempre mostrare tutte le righe di ATABLE1 e applicare anche alcune restrizioni.

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                      

Perché non vengono visualizzate tutte le colonne di ATABLE1 anche con join sinistro? Come posso farli apparire?

Grazie mille in anticipo.


+1, in particolare per lo sforzo che hai
dedicato

"Perché non vengono visualizzate tutte le colonne di ATABLE1 anche con join sinistro?" - intendevi dire "tutte le righe"?
Jack dice di provare topanswers.xyz il

@JackDouglas sì, avrebbe più senso.
Aaron,

Risposte:


7

Quando si aggiungono i filtri WHERE alla tabella opzionale / esterna, si modifica la query in UN JOIN INNER. È necessario aggiungere la condizione nel join, nella tabella derivata o nel 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

Perché non vengono visualizzate tutte le colonne di ATABLE1 anche con join sinistro? Come posso farli apparire?

Questo perché stai dicendo alla tua query di riportare solo ATABLE.column1. Se prendi gbn o le domande di Jack, indica ATABLE1. * (O specifica il nome di ognuna di esse) nella clausola 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;

1
Interessante, spero sicuramente che l'OP non sia confuso su come elencare tutte le colonne. D'altra parte è quello che hanno chiesto. +1.
Leigh Riffel,

2

Un'alternativa all'aggiunta della condizione al join è testare nullnel filtro:

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;

Preferisco questa variante ma potresti considerarla meno leggibile:

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'unico motivo per farlo è se per qualche motivo non è possibile inserire la condizione nel filtro (che a volte è il caso in una query più complessa)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.