2011-07-15 126 views
0

我被卡住了,我试图找到一个解决方案,所以请帮助!SQL Server 2008 GROUP BY

我有3个表:

Books (id, title, ...) 

Authors (id, name, surname, ...) 

book_authors (bookID, authorID, whatisdoing) 

现在我想找回取决于标题(用户搜索)和所有其他的信息(作者姓名,姓)的所有书籍。但是,我希望书名只有在第一次出现book_authors.whatisdoing时才会显示。

在MS Access中,我用first函数实现了这个功能,但是现在first不起作用,用min我没有得到我想要的结果。

任何帮助将不胜感激。

Access中的查询是:

SELECT 
    First(book_authos.whatisdoing) AS FirstOfidiothta_ID, 
    First(authors.name) AS onoma, 
    First(authors.surname) AS eponymo, 
    books.ID, books.title, books.photoLink 
FROM (books 
INNER JOIN book_authors ON books.ID = book_authors.book_ID) 
INNER JOIN authors ON book_authors.author_ID = authors.ID 
GROUP BY 
    books.ID, books.titlos, books.photoLink, books.active 
HAVING 
    (((books.titlos) Like '%" & textString & "%') AND 
    ((books.active)=True) AND ((First(authors.active))=True)) 
ORDER BY 
    First(book_authos.whatisdoing), books.title 

回答

0

编辑:基于OP的意见改变。
编辑2:修正以纠正缺陷。

您可以试试这个。

SELECT aba.name, aba.surname, aba.whatisdoing, 
    b.ID, b.title, b.photoLink 
FROM Books b 
JOIN 
    (
    SELECT ba.bookID, ba.whatisdoing, a.name, a.surname, 
     ROW_NUMBER() OVER (PARTITION BY ba.bookID ORDER BY ba.whatisdoing) AS sequence 
    FROM book_authors ba 
    JOIN Authors a ON ba.authorID = a.id 
    WHERE a.active = 1 
    ) AS aba ON b.id = aba.bookID 
WHERE b.title LIKE '%' + @textString + '%' 
    AND b.active = 1 
    AND aba.sequence = 1 

ROW_NUMBER函数分配一个行号,以基于在所述PARTITION BY子句和ORDER BY子句定义的次序所定义的基团的行。

@textString是一个SQL Server变量。我不确定你将如何分配这种情况。

SQL Server中的布尔数据类型是BIT,值为0表示false,值为1表示true。