ओरेकल की लेफ्ट जॉइन होती है और जहां गलतियां होती हैं


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 के सभी कॉलम बाएं जोड़ के साथ भी क्यों नहीं दिखाए जा रहे हैं ?" - क्या आपका मतलब 'सभी पंक्तियों' से था?
जैक का कहना है कि

@JackDouglas हाँ, यह अधिक समझ में आता है।
हारून

जवाबों:


7

जब आप वैकल्पिक / बाहरी तालिका में WHERE फ़िल्टर जोड़ते हैं, तो आप क्वेरी को INNER JOIN में बदल देते हैं। आपको शर्त को जॉइन, या व्युत्पन्न तालिका, या सीटीई में जोड़ना होगा।

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 या जैक के प्रश्नों को लेते हैं, तो बस ATABLE1 को इंगित करें। * (या विशेष रूप से उनमें से प्रत्येक का नाम) अपने चयन खंड में देखें:

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.