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
Esto funciona como se esperaba. La cuestión es que siempre quiero que se muestren todas las filas de ATABLE1 y también aplique algunas restricciones.
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
¿Por qué no se muestran todas las columnas de ATABLE1 incluso con la unión izquierda? ¿Cómo puedo hacer que aparezcan?
Muchas gracias por adelantado.
Respuestas:
Cuando agrega filtros WHERE a la tabla opcional / externa, cambia la consulta a INNER JOIN. Debe agregar la condición a la unión, o tabla derivada, o CTE.
fuente
Esto se debe a que le está diciendo a su consulta que solo devuelva ATABLE.column1. Si acepta consultas de gbn o Jack, solo indique ATABLE1. * (O nombre específicamente cada una de ellas) en su cláusula SELECT:
fuente
Una alternativa para agregar la condición a la unión es probar
null
en el filtro:Prefiero esta variante, pero puede considerarla menos legible:
La única razón para hacerlo es si por alguna razón no puede poner la condición en el filtro (que a veces es el caso en una consulta más compleja)
fuente