2009-11-22 106 views
1

我想知道是否有人可以帮助我链接连接 - 我不理解思维过程。链接连接问题

An example with three tables: 

ArticleCategories 
----------------- 
CategoryID 
CategoryName 

Articles 
--------- 
ArticleID 
ArticleText 
CategoryID (FK) 

ArticleComments 
----------------- 
CommentID 
ArticleID (FK) 
CommentText 

我有一个SP,以获取特定类别的所有物件,包括对文章的评论的计数物品的信息,但我觉得它需要改进。 我的斗争导致了这一点:


With resultSet AS 
(
    select 
    a.ArticleID 
    , a.ArticleText 
    , a.CategoryID 
    , c.CommentCount 
    from Articles a 
    Left Outer Join 
    (Select count(c.CommentID) as CommentCount, c.ArticleID 
    from Comments c  
    Group BY c.ArticleID 
    ) c 
    on a.ArticleID = c.ArticleID 
) 
select * from resultSet 
where resultSet.CategoryID = 2 

应该如何我写了这个?我正在寻找一种方法来消除resultSet和resultSet上的select。

感谢任何帮助 比尔

+0

再次感谢所有人的回答。对于Group BY有点麻烦的其他人(为什么选择中的每个列都必须是该组的一部分),以下是一个很好的讨论: http://weblogs.sqlteam.com/jeffs/archive/2007/ 07/20/60261。aspx -BillB – BillB 2009-11-22 17:31:06

回答

2

您与WITH子句查询中删除:

SELECT a.articleid, 
      a.articletext, 
      a.categoryid, 
      COALESCE(c.commentcount, 0) AS commentcount, 
    FROM ARTICLES a 
LEFT JOIN (SELECT c.articleid, 
        COUNT(c.commentid) AS commentcount 
      FROM COMMENTS c  
     GROUP BY c.articleid) c ON c.articleid = a.articleid 
    WHERE a.categoryid = 2 

我加聚结处理时的文章没有意见 - 这是Oracle和SQL Server中的安全,虽然你没有提到你正在使用。据我所知,由于WITH子句,它只能是SQL Server,Oracle或DB2。

+0

OMG小马 - 感谢包括Coalesce - 不知道存在,它非常有帮助。我发现它也可以在MySQL中使用。另外,你的名字让我感到困惑。 – BillB 2009-11-22 16:25:17

+0

我喜欢这个答案,因为它不依赖于那些真的不属于那个组的列名。我找到了一个链接,说如果你只是因为他们在Select中而把一个列名放在一个组中,那么你正在做的事情更难以阅读,如果不是糟糕的形式。这是一个长时间的讨论,原帖的作者为自己辩护: http://weblogs.sqlteam.com/jeffs/archive/2005/12/14/8546.aspx – BillB 2009-11-22 21:45:55

1

关闭....

你可以采取内选出来:

select a.ArticleID , a.ArticleText , a.CategoryID , count(c.CommentCount) 
from Articles a 
left join Comments c on a.articleid=c.articleid 
where articleid=2 
group by a.ArticleID , a.ArticleText , a.CategoryID 
+0

这是有效的,因为存在函数依赖项ArticleID => ArticleText和ArticleID => CategoryID,因此分组不会创建任何新的(子)组。然而,从语义角度来看,除了ArticleID – Dmitry 2009-11-22 01:24:05

+0

德米特里之外,您不需要任何东西进行分组,这要感谢他们加入了对该组的澄清 - 这就是最令我困惑的。它仍然很实用,如果我正在读你的话:我们必须添加ArticleID和ArticleText,以满足数据库引擎(编译器),同时降低意图的清晰度。我将不得不阅读更多关于Group By的内容。 – BillB 2009-11-22 16:33:47

1
select a.articleid, count(c.*) as commentcount 
from articles a 
left join articlecomments c on a.articleid = c.articleid 
where a.categoryid = @categoryid 
group by a.articleid 
1

如果我理解你的权利,你就像是:

SELECT 
    a.ArticleID, 
    a.ArticleText, 
    a.CategoryID, 
    (select count(*) from comments c where c.articleid=a.articleid) 
FROM 
    article a 
WHERE 
    a.categoryid=2 

OR

SELECT 
    a.ArticleID, 
    a.ArticleText, 
    a.CategoryID, 
    count(c.commentid) 
FROM 
    article a 
    left outer join comment c on c.articleid=a.articleid 
WHERE 
    a.categoryid=2 
GROUP BY 
    a.ArticleID, 
    a.ArticleText, 
    a.CategoryID 
+0

为了清晰起见,我喜欢第一个。 - Billb – BillB 2009-11-22 18:18:02

1

他的过程中构建查询时,我经历:

首先,什么是主要的驱动表?对你来说,你得到的信息有关articles,使建议的The articles表:

select * from articles 

接下来,还有什么其他的表,我需要拉进来,而且这些需要的表,以获得其余的信息我需要吗?你需要ArticleComments,这是可选:

select 
    * 
from 
    Articles a 
    left join ArticleComments acomm on acomm.ArticleID = a.ArticleID 

而现在,什么样的数据我是不是真的需要这个查询返回? (而且也混了,只是为了节省了一步,我需要什么选择标准?)

select 
    a.ArticleID, 
    a.ArticleText, 
    a.CategoryID, 
    count(c.*) CommentCount 
from 
    Articles a 
    left join ArticleComments acomm on acomm.ArticleID = a.ArticleID 
where 
    a.CategoryID = @CatID 
group by 
    a.ArticleID 

就打破它,在一步一个脚印,并在您需要从数据工作,通过和你需要什么数据。

+0

Donnie,感谢您对思考过程的描述 - 这正是我真正想要的。如果代码没有调整,我会检查你的回复。 – BillB 2009-11-22 16:27:20