2010-04-29 12 views
5

Tengo un procedimiento almacenado con una instrucción de selección, así:necesita ayuda con una sentencia condicional SELECT

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

Esto limita los resultados a los autores que tienen registros de libros. Esta es la tabla de Libros:

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

Lo que quiero hacer es condicional, seleccione el ID del libro ofrecido por cada autor como parte de la instrucción de selección anterior, y si ninguno de los libros de un autor se ofrecen , seleccione la ID del primer (top 1) libro por el autor de la tabla de libros. ¿Cómo me acerco a esto?

+0

¿Qué quiere decir con el "primer" libro? Ordenado por qué? ¿Solo quieres decir traer cualquier libro? –

+0

Correcto - de manera realista, cualquier libro de ese autor. Quise decir top 1 ordenado por book_ID. – Ethan

Respuesta

1

Puede utilizar una consulta sub que ordena los datos y utiliza la sentencia subir ...

Algo a lo largo de las líneas,

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

intente esto:

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 

SALIDA :

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

Según entiendo la pregunta, no se desean autores sin libros. 'Esto limita los resultados a los autores que tienen registros de libros. –

+0

@ Mark Byers, no leí la pregunta de esa manera. Tu tranquilidad no forma parte de la sección "Lo que quiero ..." de la pregunta. El OP solo menciona que tienen un procedimiento almacenado ... esto limita ... 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

Lo siento, eso está mal. Leí mal la publicación. – souLTower

0

La relación no tiene orden en teoría. Entonces, "el primer libro" idealmente debería ser especificado por alguna regla de agregación. Si está satisfecho con "min (bookID)" entonces algo así:

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 
Cuestiones relacionadas