2011-07-15 23 views
0

私は立ち往生しています。解決策を見つけようとしています。だから助けてください!SQL Server 2008 GROUP BY

Books (id, title, ...) 

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

book_authors (bookID, authorID, whatisdoing) 

は、今私は、タイトル(ユーザー検索)および他のすべての情報(著者名、姓)に応じて、すべての書籍を取得したい:

は、私は3つのテーブルを持っています。しかし、私は書籍のタイトルを一意にして、最初に表示されるのは 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

EDIT:OPのコメントに基づいて変更しました。
EDIT 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関数は、句とORDER BY句によって定義された順序によってパーティションに定義されたグループに基づいて行に行番号を割り当てます。

@textStringはSQL Server変数です。私はあなたの状況でこれをどのように割り当てるのかは分かりません。

ブール型のデータ型はSQL ServerではBITで、値はfalseは0、trueは1です。