2010-04-29 66 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