Domanda

Sto cercando di ottenere il nome di un prodotto e il suo numero di vendite da due tavoli separati.

I miei tavoli sono qualcosa del tipo:

BOOK
Book_ID | Book_Title | Book_Author  

SOLD  
Transaction_ID | Book_ID | Customer_ID  

posso ottenere la maggior parte dei risultati che voglio dalla seguente query

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;

Tuttavia, questo visualizza solo i prodotti con almeno una vendita. Vorrei potrai vedere tutti i prodotti, semplicemente mostrando uno zero se non si sono verificati vendite. Sono stato nei guai con qualcosa di simile:

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;

Ma la clausola WHERE sta limitando i risultati a quelli con 1 o più vendite.

Qualcuno può suggerire un modo per aggirare questo? Sto usando Oracle 10g.

Grazie

È stato utile?

Soluzione

utilizzare un join esterno sinistro:

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;

Altri suggerimenti

È inoltre possibile utilizzare una subquery correlata nella clausola select:

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

Non necessita né group by o outer joins, che può essere lento per gran numero di righe.

Come ha detto @Vincent, è necessario un outer join. Non ho lavorato molto con Oracle ultimamente, ma il suo esterno proprietaria join sintassi è piuttosto bizzarro. (Non so se hanno raggiunto con ANSI su quello.)

La sintassi proprietaria è:

  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;

Si dovrebbe ottenere il conteggio in una sottoquery e lasciato join esterno ad esso, come ad esempio:

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

fa un altro join dal libro al venduto. si può ancora ottenere un nullo per il conteggio, ma risolvere che con l'aggiunta di un NVL in cima a quello ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top