2012-05-11 14 views
3

に参加します各本の作者と内部結合を使用してDataListコントロール内に表示する書籍がありますが、各書籍には多数の著者が存在する可能性があるため、結合によって複数の重複行が発生するため、各著者ごとに行があります。
例:多くの関係に多くの列の値をマージすると、3番目のテーブルを介してそれらの間に多対多の関係は、<strong>book_authors</strong>と呼ばれて、私はすべて一覧表示しようとしています、私は2つのテーブル、<strong>ブックス</strong>と<strong>著者</strong>を持って

book_title   author 
b1     a1 
b1     a2 

ことになるので、この問題を解決する最良の方法は何ですか:たぶん

book_title    author 
b1      a1, a2 
+0

dbでサブクエリと文字列連結関数を使用し、表示する唯一の文字列として作成者のリストを指定します。 – Gabber

+0

これらの記事を見てください:http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-ms-sql-server-2005、http://stackoverflow.com/questions/ 273238/using-to-concatenate-strings-in-sql-serverおよびhttp://stackoverflow.com/questions/941103/concat-groups-in-sql-server – Marco

答えて

4

このような何か:

SELECT 
    Books.book_title, 
    STUFF 
    (
     (
      SELECT 
       ',' +author 
      FROM 
       book_authors 
       JOIN Authors 
        ON book_authors.authorId=Authors.authorId 
      WHERE 
       book_authors.bookId=Books.bookid 
      FOR XML PATH('') 
     ) 
    ,1,1,'') 
FROM 
    Books 

EDIT

それは、あなたとは言い難いta。い、この作品:

DECLARE @Table1 TABLE(ID INT) 
DECLARE @Table2 TABLE(Name varchar(100),ID INT) 

INSERT INTO @Table1 VALUES(1),(2) 
INSERT INTO @Table2 VALUES('test1',1),('test2',1),('test3',2),('test4',2) 

SELECT 
    t1.ID, 
    STUFF 
    (
     (
      SELECT 
       ',' +t2.Name 
      FROM 
       @Table2 AS t2 
      WHERE 
       t1.ID=t2.ID 
      FOR XML PATH('') 
     ) 
    ,1,1,'') 
FROM 
    @Table1 AS t1 
+0

答えが – Arion

+0

に更新されました。ありがとう、あなたは私の人生を救った。私はそれを機能させることができました。 –

+0

問題ありません。喜んで助けてください:P – Arion

1

あなたは、あなたが著者のリストを書籍IDを取得してyeildsサブクエリが必要になります純粋なSQLでそれをしたい場合は、(CSV thatsのは、あなたがそれをしたいどのような場合)など結果。一意の各ブックIDに対してがある別のクエリ内のそのサブクエリを使用して、はbook_titleとauthorリストを返します。

純粋なSQLを使用しても構いませんが、現在取得しているDataListを繰り返し処理して、マップタイプの構造(book_title - > authorList)を作成してください。

最良の選択は、あなたがこれをどのように使用しているかの範囲に依存しますが、一般的には、SQLのルートが行く方法です。

+0

これはまさに私がやろうとしていたものですが、私はそれを行うSQLクエリーを理解することができません。 –

+1

私はそれをすべて書き出す時間がないことをお詫びしますが、[こちら](http://blog.sqlauthority.com/2009/11/25/sql-server-comma-separated-values-csv-from-table-列/)は、テーブルを取ってcsv文字列にする方法に関するリンクです。これを関数にすると、クエリの中で使うことができます。 この関数にbook idを渡すだけで、csv文字列が返され、すべての書籍に適用されます。あなたが持っている作者の最大数を知っているなら、G. Linoffによる以下の投稿も機能します。 –

1

文字列集約連結です。このテーマには非常に良い記事がいくつかあります。あなたは単にあなたがselect文で十分な作家が含まれていることを確認する必要があり

select b.name, 
     (max(case when authornum = 1 then author else '' end) + 
     max(case when authornum = 2 then ', '+ author else '' end) + 
     max(case when authornum = 3 then ', '+ author else '' end) 
     ) as authors 
from (select ba.*, 
       row_number() over (partition by bookid order by authorid) as authornum 
     from BookAuthors ba 
    ) bajoin 
     Authors a 
     on a.authorid = ba.authorid join 
     Books b 
     on b.bookid = ba.bookid 
group by b.name 

:本はあまりにも多くの作家を持っていないので、ここで

は、あなたのケースで簡単に働くかもしれない代わり、です。

+0

ありがとう、もし私が必要ならばこれを試してみるかもしれません、上記の投稿はしばらくの間うまくいきました。 –

関連する問題

 関連する問題