Oracle зліва приєднується і де клаузує помилки


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    

Це працює як очікувалося. Вся справа в тому, що я завжди хочу, щоб всі рядки з ATABLE1 були показані, а також застосувати деякі обмеження.

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                      

Чому не відображаються всі стовпці з ATABLE1 навіть з лівим з'єднанням? Як змусити їх з’явитися?

Заздалегідь дякую


+1, особливо за зусилля, які ви доклали до налаштування тестових об'єктів
Джек каже спробувати topanswers.xyz

"Чому всі стовпці з ATABLE1 не відображаються навіть з лівим з'єднанням?" - ти мав на увазі сказати «всі ряди»?
Джек каже спробувати topanswers.xyz

@JackDouglas так, це мало б більше сенсу.
Аарон

Відповіді:


7

Коли ви додаєте фільтри WHERE до додаткової / зовнішньої таблиці, ви змінюєте запит на ВНУТРІШНЕ ПРИЄДНАННЯ. Потрібно додати умову в таблицю приєднання, або похідну таблицю або 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

Чому не відображаються всі стовпці з ATABLE1 навіть з лівим з'єднанням? Як змусити їх з’явитися?

Це тому, що ви повідомляєте свій запит, щоб повернути лише ATABLE.column1. Якщо ви приймаєте запити gbn або Jack, просто вкажіть ATABLE1. * (Або конкретно назвіть кожен із них) у своєму пункті 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
Цікаво, я сподіваюся, що ОП не плутають, як перелічити всі стовпці. З іншого боку, це те, про що вони запитували. +1.
Лі Ріффер

2

Альтернативою додавання умови до приєднання є тестування nullна фільтр:

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;

Я вважаю за краще цей варіант, але ви можете вважати його менш читабельним:

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;

Єдина причина цього - це якщо ви з якихось причин не можете поставити умову у фільтр (що іноді трапляється у складнішому запиті)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.