2010-04-29 23 views
5

Mam procedurę przechowywaną z select coś takiego:Potrzebujesz pomocy z warunkowym SELECT

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

Ogranicza wyniki do autorów, którzy rekordy książek. Jest to tabela Książki:

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

Co chcę zrobić, to warunkowo wybrać identyfikator opisywany książki przez każdego autora jako część instrukcji wyboru powyżej, a jeśli żadna z książek dla danego autora jest opisywany , wybierz identyfikator pierwszej (pierwszej 1) książki autora z tabeli książek. Jak mam się do tego podejść?

+0

Co masz na myśli mówiąc o "pierwszej" książce? Zamówione przez co? Czy chodzi ci tylko o pobranie * jakiejś książki? –

+0

Dobrze - realistycznie, każda książka tego autora. Miałem na myśli górę 1, zamówioną przez book_ID. – Ethan

Odpowiedz

1

Można użyć kwerendy sub który nakazuje danych i wykorzystuje górną oświadczenie ...

Coś wzdłuż linii,

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

spróbuj tego:

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

Jak rozumiem pytanie, autorzy bez książek nie są poszukiwani. 'Ogranicza to wyniki dla autorów, którzy mają zapisy księgowe." –

+0

@ Mark Byers, nie czytałem tego pytania w ten sposób. Twój całkiem nie jest częścią sekcji "Co chcę ...". OP tylko wspomina, że ​​mają procedurę przechowywaną ... to ogranicza ... itd. –

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

Niestety, to jest złe. Źle przeczytałem wpis. – souLTower

0

Relacja nie ma uporządkowania w teorii. Tak więc "pierwsza książka" powinna być idealnie określona przez pewną regułę agregacji. Jeśli spełniasz "min (bookID)", to coś takiego:

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 
Powiązane problemy