2011-12-20 75 views
1

我試圖拉取存在於幾個不同表格中的數據。具體來說,我有一個bug表,以及一個關於這些bug的「posts」(註釋/更新)表。對於每個錯誤,可能沒有評論,一條評論或很多。我希望返回所有錯誤,並返回所有評論(儘管我想省略更新),但是作爲列,而不是每個錯誤/評論一行。一對多關係 - 一個項目有很多評論

這裏就是我開始:

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 

這給了我一個排爲每個評論,這不是我想要的。正如你所看到的,我還試圖限制結果只包括「評論」類型的帖子,但是這排除了沒有評論的任何錯誤,所以我把它解決了。

我發現這篇文章似乎其相關: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

你應該把那個過濾器只留在'只有評論'裏面,但是把'INNER JOIN'改成'LEFT JOIN',那麼你會看到所有的錯誤都是天氣或者他們沒有評論。

您正在尋找的另一個函數被稱爲'pivot',它將行(註釋)遍歷到列中。

我不知道SQL Server 2008自己,但發現這個鏈接的關鍵: directly to microsoft

所以,除了「評論欄」的行動,這可能是您的查詢:

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)。這個工具期望每個評論作爲一個專欄,並且每個錯誤只作爲一行。那有意義嗎?如果沒有,我會添加我想看到的例子。 – user1108721

+0

我懷疑PIVOT對於這個問題至多是過度的,最壞的情況下根本無法解決。你提出什麼建議,我們用作樞軸鍵,不會導致每個評論獲得自己的一組列?據推測,您需要爲每個評論分配一個序列號,該序列號與bug鍵定義的組相關。這可能可以完成,但是更大的問題仍然存在:爲什麼當你可以處理評論行?作爲sacundim指出的 –

+0

@ user1108721就像是一個「壞主意」。你要麼必須犧牲評論(如果評論太多),要麼一直有空列(如果評論太少)。我建議您使用我的示例,並使用您的編程語言手動將註釋打包到CSV中。 –

0

對於每一個錯誤,有可能是沒有意見,一個意見,還是很多的。我希望返回所有錯誤,並返回所有評論(儘管我想省略更新),但是作爲列,而不是每個錯誤/評論一行。

對於任意數量的評論,這是無法完成的。這將要求查詢返回可變數量的列,具體取決於數據 - 但在SQL中,結果集中的列數完全由查詢和表定義確定。

您將需要爲每個評論拉動一行(從類似於您的查詢或從僅拉取評論數據的查詢),並且將每個評論數據行手動添加到表示它的對象錯誤。 (大多數對象關係映射器以這種方式處理一對多關係,順便說一句)。

相關問題