2010-04-29 65 views
5

我有一個存儲過程使用SELECT語句,就像這樣:需要幫助有條件的SELECT語句

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

這限制結果誰有書記載的作者。這是書籍表:

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

我想要做的是有條件的select語句的一部分,每位作者選擇上面的特色本書的ID,如果沒有的書籍給定作者的特色,從書籍表中選擇作者的第一張(前1張)書的ID。我如何解決這個問題?

+0

你是什麼意思的「第一本」書?按什麼命令?你的意思是取回*任何*書? – 2010-04-29 17:27:07

+0

正確 - 實際上,該作者的任何書。我的意思是由book_ID訂購的top 1。 – Ethan 2010-04-29 17:35:40

回答

1

您可以使用子查詢定單數據,並使用頂部的語句...沿線的

東西,

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

試試這個:

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

據我瞭解這個問題,沒有書籍的作者是不需要的。 「這限制了有書籍記錄的作者的結果。」# – 2010-04-29 17:46:48

+0

@Mark Byers,我沒有這樣讀過這個問題。你完全不是我想要的問題的一部分。 OP只提到他們有一個存儲過程......這限制了......等等。 – 2010-04-29 18:34:28

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

對不起,這是錯誤的。我誤讀了帖子。 – souLTower 2010-04-29 17:49:35

0

關係在理論上沒有排序。所以理想的「第一本書」應該由一些聚合規則來指定。如果你滿意「min(bookID)」那麼類似的東西:

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