一对多的关系 - 一个有很多评论的项目

时间:2011-12-20 21:46:27

标签: sql sql-server-2008 one-to-many

我正在尝试提取存在于几个不同表中的数据。具体来说,我有一个表的bug,以及一个关于这些错误的“帖子”(评论/更新)表。对于每个错误,可能没有评论,一条评论或许多。我希望返回所有错误,并返回所有注释(虽然我想省略更新),但作为列,而不是每个错误/评论一行。

这是我开始的地方:

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知识非常有限,但任何人都可以提供的帮助将非常感激。谢谢!

2 个答案:

答案 0 :(得分:0)

你应该将那个过滤器留给那里的'only comments',但是将'INNER JOIN'更改为'LEFT JOIN'然后你会看到所有的bug天气是否天气都有评论。

您正在寻找的另一个函数称为“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

答案 1 :(得分:0)

  

对于每个错误,可能没有评论,一条评论或许多评论。我希望返回所有错误,并返回所有注释(虽然我想省略更新),但作为列,而不是每个错误/评论一行。

对于任意数量的评论都无法做到这一点。这将要求您的查询返回可变数量的列,具体取决于数据 - 但在SQL中,结果集中的列数完全由查询和表定义确定。

您需要为每条评论提取一行(来自与您类似的查询,或者来自仅提取评论数据的查询),并手动将每个评论数据行添加到代表其错误的对象。 (大多数对象关系映射器以这种方式处理一对多关系,BTW。)