2011-12-20 18 views
1

私は、いくつかの異なるテーブルに存在するデータを取得しようとしています。具体的には、私はバグのテーブルとそのバグの "投稿"(コメント/更新)のテーブルを持っています。それぞれのバグについて、コメント、コメント、または多くのものがないかもしれません。すべてのバグが返され、すべてのコメントが返されます(私は更新を残しておきますが)が、バグ/コメントごとに1つの行ではなく、列として返されます。私が始めたのはここ1対多の関係 - 多くのコメントを持つ1つの項目

です:

select 
b.bg_id, 
b.bg_reported_date as "Date Created", 
b.bg_short_desc as "Summary", 
bp.bp_comment_search as "Comment Body", 
s.st_name as "Status", 
p.pr_name as "Priority", 
bp.bp_type as "Update Type" 
from 
bugs b 
inner join bug_posts bp on b.bg_id = bp.bp_bug 
inner join statuses s on b.bg_status = s.st_id 
inner join priorities p on b.bg_priority = p.pr_id 
--where bp.bp_type = 'comment' 
order by b.bg_id asc 

これは私が欲しいものではありません各コメント、に1つの行を与えました。ご覧のとおり、「コメント」タイプの投稿のみを含むように制限しようとしましたが、コメントのないバグは除外されました。

私は、関連するように見えたこの記事が見つかりました:JOIN in SQL with one-to-many relationship

をしかし、私はそれが私のクエリを使用して動作させることはできません。ここで私がこれまで持っているものです。

select 
b.bg_id, 
b.bg_reported_date as "Date Created", 
b.bg_short_desc as "Summary", 
--bp.bp_comment_search as "Comment Body", 
s.st_name as "Status", 
p.pr_name as "Priority", 
--bp.bp_type as "Update Type" 
from 
bugs b 
left outer join 
    (select bp_comment_search as "Comment Body" 
    from bug_posts 
    group by bp_bug) bp on bp.bp_bug = b.bg_id 
--inner join bug_posts bp on b.bg_id = bp.bp_bug 

inner join statuses s on b.bg_status = s.st_id 
inner join priorities p on b.bg_priority = p.pr_id 
--where bp.bp_type = 'comment' 
order by b.bg_id asc 

マイSQLの知識は非常に限られているが、誰もが提供できるすべてのヘルプははるかに高く評価されるだろう。ありがとう!

+0

どの種類のSQL(MySQL、Postgres、Oracle、MSSql)を使用していますか?そのバージョンは何ですか? –

+0

私はSQL Server 2008を使用しています – user1108721

+0

私は私の答えに以下の例を追加しました。行の代わりに列にコメントを置く部分 - >なぜそれを望みますか?あなたは望ましい出力の例を挙げることができますか? –

答えて

0

このフィルタは「コメントのみ」にしておきますが、「内部結合」を「LEFT JOIN」に変更すると、すべてのバグが天気かどうか、コメントは表示されません。

あなたが探している他の機能は「ピボット」と呼ばれ、(コメントの)行を列にトラバースします。

私自身はSQL Server 2008についてよくわかりませんが、ピボットの場合は directly to microsoftというリンクが見つかりました。コメント、1件のコメント、または多くはないかもしれない、それぞれのバグについては

select 
b.bg_id, 
b.bg_reported_date as "Date Created", 
b.bg_short_desc as "Summary", 
bp.bp_comment_search as "Comment Body", 
s.st_name as "Status", 
p.pr_name as "Priority", 
from 
bugs b 
left join bug_posts bp on b.bg_id = bp.bp_bug AND bp.bp_type = 'comment' 
inner join statuses s on b.bg_status = s.st_id 
inner join priorities p on b.bg_priority = p.pr_id 
order by b.bg_id asc 
+0

私はこれをExcel(CSV)にエクスポートして別のツール(JIRA)にインポートする予定であるため、コメントを行ではなく列として使用したいと考えています。このツールは各コメントを列として、各バグを1行だけと見なします。それは理にかなっていますか?そうでない場合は、私が見たいものの例を追加します。 – user1108721

+0

私はPIVOTがこの問題のために最高の過酷な過労であると思っています。そして、最悪の場合、それをまったく解決しません。独自の列を取得する各コメントにつながりませんピボットキーとして使用することを提案しているものは何ですか?おそらく、各コメントにバグキーで定義されたグループを基準にしたシーケンス番号を割り当てる必要があります。それはおそらく実行できますが、大きな問題が残っています。コメント行を処理できるのはなぜですか? –

+0

@ user1108721 sacundimは「BAD IDEA」のようなものだと指摘しています。あなたはコメントを犠牲にしなければなりません(あまりにも多い場合)または空の列を常に(もし少なすぎる場合は)持つ必要があります。私は私の例を使用して、プログラミング言語でCSVにコメントをパックすることをお勧めします。 –

0

ので、アクション「列へのコメント」を除いて、これはあなたのクエリである可能性があります。すべてのバグが返され、すべてのコメントが返されます(私は更新を残しておきますが)が、バグ/コメントごとに1つの行ではなく、列として返されます。

これは、任意の数のコメントに対しては実行できません。これにより、クエリによってデータに応じて可変数の列が返される必要がありますが、SQLでは、結果セットの列数はクエリとテーブル定義によって完全に決定されます。

コメントごとに1行(あなたのようなクエリやコメントデータを取得するだけのクエリ)を作成し、各コメントデータ行を手動で追加する必要がありますバグ。

関連する問題