Oracle'ın sol birleşimi ve yan tümceleri hataları


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    

Bu beklendiği gibi çalışır. Şey, her zaman ATABLE1 tüm satırların gösterilmesini ve ayrıca bazı kısıtlamalar uygulamak istiyorum.

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'deki tüm sütunlar neden sol birleşimle bile gösterilmiyor? Onları nasıl gösterebilirim?

Şimdiden çok teşekkürler.


+1, özellikle test nesnelerini ayarlamak için harcadığınız çaba için
Jack diyor ki topanswers.xyz

"Neden ATABLE1'deki tüm sütunlar sol birleşimle bile gösterilmiyor?" - 'tüm satırlar' mı demek istediniz?
Jack diyor ki topanswers.xyz

@JackDouglas evet, bu daha mantıklı olurdu.
Aaron

Yanıtlar:


7

WHERE filtrelerini isteğe bağlı / dış tabloya eklediğinizde, sorguyu bir INNER JOIN olarak değiştirirsiniz. Koşulu birleştirmeye veya türetilmiş tabloya veya CTE'ye eklemeniz gerekir.

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'deki tüm sütunlar neden sol birleşimle bile gösterilmiyor? Onları nasıl gösterebilirim?

Çünkü sorgunuza yalnızca ATABLE.column1 öğesini geri getirmesini söylüyorsunuz. Gbn veya Jack'in sorgularını alırsanız, SELECT yan tümcesinde ATABLE1. * (Veya her birini özel olarak adlandırın) belirtin:

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
İlginç, eminim OP tüm sütunları listeleme konusunda karışık değildir. Öte yandan sordukları da buydu. +1.
Leigh Riffel

2

Birleştirmeye koşulu eklemenin bir alternatifi null, filtrede test etmektir:

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;

Bu varyantı tercih ederim, ancak daha az okunabilir olarak düşünebilirsiniz:

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;

Bunu yapmanın tek nedeni, herhangi bir nedenle koşulu filtreye koyamamanızdır (bazen daha karmaşık bir sorguda durumdur)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.