ওরাকলের বাম যোগদান এবং যেখানে ক্লজগুলির ত্রুটি


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 18'12

@ জ্যাকডুগলাস হ্যাঁ, এটি আরও অর্থবোধ করে।
হারুন

উত্তর:


7

আপনি যখন ERচ্ছিক / বাইরের সারণিতে WHERE ফিল্টারগুলি যুক্ত করেন, তারপরে আপনি কোয়েরিটিকে একটি অন্তর্ভুক্ত যোগদান করুন। আপনাকে শর্তটি জোড়, বা উত্পন্ন টেবিল বা সিটিইতে যুক্ত করতে হবে।

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 ফিরিয়ে আনতে বলছেন। আপনি যদি জিবিএন বা জ্যাকের প্রশ্নাগুলি গ্রহণ করেন তবে কেবল সারণি 1 নির্দেশ করুন * * (বা বিশেষত তাদের প্রত্যেকের নাম দিন) আপনার নির্বাচন বিভাগে:

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;

এটি করার একমাত্র কারণ হ'ল যদি কোনও কারণে আপনি শর্তটি ফিল্টারে রাখতে না পারেন (যা কখনও কখনও আরও জটিল প্রশ্নের ক্ষেত্রে হয়)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.