2010-04-29 8 views
5

Ho una stored procedure con un'istruzione select, in questo modo:bisogno di aiuto con un condizionale un'istruzione SELECT

SELECT author_ID, 
     author_name, 
     author_bio 
FROM Authors 
WHERE author_ID in (SELECT author_ID from Books) 

Questo limita i risultati per gli autori che hanno una contabilità. Questa è la tabella Libri:

Books: 
book_ID INT, 
author_ID INT, 
book_title NVARCHAR, 
featured_book BIT 

Quello che voglio fare è condizionatamente selezionare l'ID del libro caratterizzato da ciascun autore come parte della dichiarazione prescelta sopra, e se nessuno dei libri di un determinato autore sono presenti , seleziona l'ID del primo (primo) libro dell'autore dalla tabella dei libri. Come approccio a questo?

+0

Cosa intendi per "primo" libro? Ordinato da cosa? Intendi solo prendere * qualsiasi * libro? –

+0

A destra - realisticamente, qualsiasi libro di quell'autore. Intendevo il primo 1 ordinato da book_ID. – Ethan

risposta

1

È possibile utilizzare una query sub che ordina i dati e utilizza l'istruzione superiore ...

Qualcosa sulla falsariga di,

SELECT author_ID, 
     author_name, 
     author_bio 
     , (Select top 1 Book_ID from Books where Authors.Author_ID=Books.Author_ID order by Featured_book desc) 
FROM Authors 
WHERE author_ID in (SELECT author_ID from Books) 
1

provare questo:

DECLARE @Authors table (author_ID INT NOT NULL, author_name VARCHAR(100) NOT NULL, author_bio VARCHAR(100) NOT NULL) 
INSERT INTO @Authors VALUES (1, 'Author1', 'Bio1') 
INSERT INTO @Authors VALUES (2, 'Author2', 'Bio2') 
INSERT INTO @Authors VALUES (3, 'Author3', 'Bio3') 

DECLARE @Books table (book_ID INT NOT NULL, author_ID INT NOT NULL, book_title VARCHAR(100) NOT NULL, featured_book INT NOT NULL) 
INSERT INTO @Books VALUES (1, 2, 'Book1', 0) 
INSERT INTO @Books VALUES (2, 2, 'Book2', 1) 
INSERT INTO @Books VALUES (3, 3, 'Book3', 0) 
INSERT INTO @Books VALUES (4, 3, 'Book4', 0) 

SELECT 
    dt.author_ID, dt.author_name,dt.author_bio,dt.book_title 
    FROM (
      SELECT 
       a.*,b.book_title,ROW_NUMBER() OVER (PARTITION by a.author_ID ORDER BY b.featured_book DESC,b.book_title) RowNumber 

      FROM Authors    a 
       LEFT OUTER JOIN Books b ON a.author_id = b.author_id 
     ) dt 
WHERE dt.RowNumber= 1 

USCITA :

author_ID author_name author_bio book_title 
----------- ------------ ----------- ---------- 
1   Author1  Bio1  NULL  
2   Author2  Bio2  Book2  
3   Author3  Bio3  Book3  

(3 row(s) affected) 
+0

Come ho capito la domanda, gli autori senza libri non sono voluti. 'Questo limita i risultati per gli autori che hanno libri contabili. –

+0

@ Marco Byers, non ho letto la domanda in questo modo. Il tuo piuttosto non fa parte della sezione "Cosa voglio ..." della domanda. L'OP accenna solo che hanno una procedura memorizzata ... questo limite ... ecc. –

0
Select X.*, BB.book_title from 
(
    SELECT A.author_ID, A.author_name, A.author_bio, 
     (Select top 1 book_ID from Books B WHERE B.author_ID = A.author_ID 
     order by B.featured_book, book_Title) as book_ID, BB.book_Title 
    FROM Authors A 
)X right join Books BB on X.book_id = BB.book_ID 
+0

Scusa, è sbagliato. Ho letto male il post. – souLTower

0

La relazione non ha ordinamento in teoria. Quindi "il primo libro" dovrebbe idealmente essere specificato da qualche regola di aggregazione. Se sei soddisfatto di "min (bookID)", allora qualcosa del genere:

SELECT Authors.author_ID, author_name, author_bio, 
    CASE max(featured_book) 
    WHEN 0 THEN min(book_ID) 
    END 
FROM Authors INNER JOIN 
    Books ON Authors.author_ID = Books.author_ID 
GROUP BY Authors.author_ID, author_name, author_bio 
Problemi correlati