2010-04-29 7 views
5

J'ai une procédure stockée avec une instruction select, comme ceci:Besoin d'aide avec une instruction conditionnelle SELECT

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

Cette limite les résultats aux auteurs qui ont des dossiers de livres. Voici la table des Livres:

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

Ce que je veux faire est de sélectionner conditionnellement l'ID du livre présenté par chaque auteur dans le cadre de l'instruction select ci-dessus, et si aucun des livres pour un auteur donné sont en vedette , sélectionnez l'ID du premier livre (le premier) de l'auteur dans la table des livres. Comment puis-je aborder cela?

+0

Qu'entendez-vous par le "premier" livre? Commandé par quoi? Voulez-vous dire simplement chercher * un * livre? –

+0

Droit - réaliste, n'importe quel livre par cet auteur. Je voulais dire le top 1 commandé par book_ID. – Ethan

Répondre

1

Vous pouvez utiliser une requête sous qui commande les données et utilise l'instruction top ...

Quelque chose le long des lignes de,

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

essayez ceci:

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 

SORTIE :

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

Comme je comprends la question, les auteurs sans livres ne sont pas recherchés. 'Cela limite les résultats aux auteurs qui ont des registres de livres.' –

+0

@ Mark Byers, je n'ai pas lu la question de cette façon. Votre calme ne fait pas partie de la section "Ce que je veux ..." de la question. L'OP mentionne seulement qu'ils ont une procédure stockée ... ceci limite ... etc –

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

Désolé, c'est faux. J'ai mal lu le message. – souLTower

0

La relation n'a pas d'ordre en théorie. Donc, "le premier livre" devrait idéalement être spécifié par une règle d'agrégation. Si vous satisfait par "min (bookID)" alors quelque chose comme ça:

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 
Questions connexes