2010-04-29 9 views
5

ich eine gespeicherte Prozedur mit einer select-Anweisung haben, wie folgt aus:Benötigen mit einer bedingten Anweisung SELECT helfen

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

Diese Grenzen Ergebnisse zu Autoren, die Buchaufzeichnungen haben. Dies ist die Books-Tabelle:

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

Was ich tun möchte, ist bedingt durch jeden Autor als Teil der select-Anweisung über die ID des vorgestellten Buch auswählen, und wenn keines der Bücher für einen bestimmten Autor Empfohlene , wählen Sie die ID des ersten (Top 1) Buches vom Autor aus der Buch-Tabelle aus. Wie gehe ich damit um?

+0

Was meinen Sie mit dem "ersten" Buch? Bestellt von was? Meinst du nur holen * irgendein * Buch? –

+0

Richtig - realistisch, jedes Buch von diesem Autor. Ich meinte Top 1 von book_ID bestellt. – Ethan

Antwort

1

Sie können eine Unterabfrage verwenden, die die Daten und verwendet die Top-Anweisung befiehlt ...

Etwas entlang der Linien von

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

try this:

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 

OUTPUT :

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

Wie ich die Frage verstehe, sind Autoren ohne Bücher nicht gewollt. 'Dies schränkt die Ergebnisse auf Autoren ein, die Buchdaten haben. –

+0

@Mark Byers, ich habe die Frage nicht so gelesen. Dein Teil ist nicht Teil des "Was ich möchte ..." -Abschnitt der Frage. Das OP erwähnt nur, dass sie eine gespeicherte Prozedur haben ... das begrenzt ... usw. –

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

Sorry, das ist falsch. Ich habe den Beitrag falsch gelesen. – souLTower

0

Beziehung hat keine Reihenfolge in der Theorie. So sollte "das erste Buch" idealerweise durch eine Aggregationsregel spezifiziert werden. Wenn Sie mit "min (bookID)" zufrieden waren, dann etwas in der Art:

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