سؤال

أحاول الحصول على اسم منتج وعدد مبيعاته من طاولتين منفصلين.

طاولاتي تبدو مثل هذا:

BOOK
Book_ID | Book_Title | Book_Author  

SOLD  
Transaction_ID | Book_ID | Customer_ID  

يمكنني الحصول على معظم النتائج التي أريدها من الاستعلام التالي

SELECT b.Book_Title, COUNT(s.Book_ID) FROM Book b, Sold s 
WHERE b.Book_ID = s.Book_ID 
GROUP BY b.Book_Title;

ومع ذلك، فإن هذا يعرض فقط المنتجات مع بيع واحد على الأقل. أود عرض جميع المنتجات، ببساطة تظهر صفر إذا لم تحدث أي مبيعات. لقد كنت العبث مع شيء مثل هذا:

SELECT b.Book_Title, 
       COUNT(CASE WHEN s.Book_ID IS NULL THEN 0 ELSE s.Book_ID END) 
FROM Book b, Sold s WHERE b.Book_ID = s.Book_ID GROUP BY Book_Title;

لكن ال WHERE جملة تحد من النتائج إلى مبيعات واحدة أو أكثر.

هل يمكن لأي شخص أن يقترح طريقة حول هذا؟ أنا أستخدم أوراكل 10G.

شكرا

هل كانت مفيدة؟

المحلول

استخدام الانضمام الخارجي الأيسر:

SELECT b.Book_Title, COUNT(s.Book_ID) 
FROM Book b left outer join Sold s on b.Book_ID = s.Book_ID 
GROUP BY b.Book_Title;

نصائح أخرى

يمكنك أيضا استخدام Sacquery المرتبطة في select بند :

select b.book_title, (select count(*) from sold s where s.book_id=b.book_id) from book b

لا تحتاج أيضا group by أو outer joinS، والتي يمكن أن تكون بطيئة لعدد كبير جدا من الصفوف.

كما قال vincent، تحتاج إلى انضمام خارجي. لم أعمل كثيرا مع Oracle مؤخرا، لكن بناء جملة الانضمام الخارجي الخاص بهما هو غريبة بالأحرى. (لا أعرف ما إذا كان قد اشتعلت مع ANSI على ذلك.)

بناء جملة الملكية هو:

  SELECT b.Book_Title,
         COUNT(s.Book_ID)
    FROM Book b,
         Sold s
   WHERE b.Book_ID = s.Book_ID (+)
GROUP BY b.Book_Title;

يجب أن تحصل على العد في استعلام فرعي وترك خارجي الصلة الخارجي إليها على هذا النحو:

select b.book_title, 
   case when s.book_id is null then 0 
       else s.salesCount end as Sales
from book b
left outer join 
  (select count(*) as salesCount, book_id from sales group by book_id) s on b.book_id = s.book_id

إجراء انضمام آخر من الكتاب إلى بيعه. قد لا تزال تحصل على خالية من العدد، لكنك حل ذلك عن طريق إضافة NVL أعلى ذلك ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top