2016-09-15 7 views
0

まず、質問がベストではないと謝罪します。私はSQLを使い慣れていないし、正しい言い回しを使ってそれをどのようにフレーズするのかもわからない。1つのSQLクエリで1つの行に各Author's Booksを表示できますか?

私はIDの主キーと名前と年齢の2つの列を持つAuthorsテーブルを持っています。

私はまた、プライマリキーがIdの書籍テーブルと、タイトル、価格、ページ、およびジャンルを持っています。

多対多関係は、他のテーブルのキーを使用してこれらの関係をペアにする中間テーブルを持つ必要があることを意味します。だから私はIdの主キー(おそらく不要)だけでなく、これらの列AuthorIdとBookIdを持つAuthorsBooksテーブルを持っています。

私の目標は、すべてのタイトルが後の列に表示された状態で、各著者を一度だけ表示する1つの結果/テーブルを作成することです。一部の著者は他の書籍よりも多くの書籍を保有している可能性がありますか?

SELECT DISTINCT Name 
     ,Title 

FROM [dbo].[AuthorsBooks] 
JOIN dbo.Authors 
    ON AuthorId = Authors.Id 
JOIN dbo.Books 
    ON BookId = Books.Id 

このような何か生成する:

Author1 Book1 
Author1 Book2 
Author1 Book5 
Author2 Book3 
Author2 Book4 
Author3 Book4 
Author3 Book5 

をしかし、私はこのような何かをしたい:

ここ

は私が取得しています私が今持っているだけでなく、結果であり、

Author1 Book1 Book2 Book5 
Author2 Book3 Book4 
Author3 Book4 Book5 

これも可能ですか?いくつかのNULLを記入する必要がある場合(最後の列には、上/下の行と一致する十分な本がない作者のエントリがない場合)は問題ありません。私はGROUP BY句を試してみましたが、エラーが続いていて、数字ではないのでこの場合に機能する集約関数を見つけることができません。

初心者であれば、よりシンプルなソリューションが最適ですが、「シンプルな」ソリューションがない場合は、これにアプローチする方法を概念化するのに役立つものがあれば大いに感謝します。

多くの感謝!

答えて

0

あなたはこれがいいです、そして実行可能かもしれないが、それ自身のコラムに、各タイトルを持っているどのような方法があり、このよう

SELECT DISTINCT NAME 
    ,(
     SELECT DISTINCT Title + ' ' 
     FROM [dbo].[AuthorsBooks] ab 
     JOIN dbo.Authors a ON ab.AuthorId = a.Id 
     JOIN dbo.Books b ON ab.BookId = b.Id 
     WHERE ab.authorid = ab1.authorid 
     FOR XML PATH('') 
     ) AS TITLE 
FROM [dbo].[AuthorsBooks] ab1 
JOIN dbo.Authors a1 ON ab1.AuthorId = a1.Id 
JOIN dbo.Books b1 ON ab1.BookId = b1.Id 
+0

を試すことができますか?このクエリは基本的に連結のようです。 – Goeff

関連する問題