链接连接问题
我想知道是否有人可以帮助我链接连接 - 我不理解思维过程。链接连接问题
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。
感谢任何帮助 比尔
您与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。
OMG小马 - 感谢包括Coalesce - 不知道存在,它非常有帮助。我发现它也可以在MySQL中使用。另外,你的名字让我感到困惑。 – BillB 2009-11-22 16:25:17
我喜欢这个答案,因为它不依赖于那些真的不属于那个组的列名。我找到了一个链接,说如果你只是因为他们在Select中而把一个列名放在一个组中,那么你正在做的事情更难以阅读,如果不是糟糕的形式。这是一个长时间的讨论,原帖的作者为自己辩护: http://weblogs.sqlteam.com/jeffs/archive/2005/12/14/8546.aspx – BillB 2009-11-22 21:45:55
关闭....
你可以采取内选出来:
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
这是有效的,因为存在函数依赖项ArticleID => ArticleText和ArticleID => CategoryID,因此分组不会创建任何新的(子)组。然而,从语义角度来看,除了ArticleID – Dmitry 2009-11-22 01:24:05
德米特里之外,您不需要任何东西进行分组,这要感谢他们加入了对该组的澄清 - 这就是最令我困惑的。它仍然很实用,如果我正在读你的话:我们必须添加ArticleID和ArticleText,以满足数据库引擎(编译器),同时降低意图的清晰度。我将不得不阅读更多关于Group By的内容。 – BillB 2009-11-22 16:33:47
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
如果我理解你的权利,你就像是:
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
为了清晰起见,我喜欢第一个。 - Billb – BillB 2009-11-22 18:18:02
他的过程中构建查询时,我经历:
首先,什么是主要的驱动表?对你来说,你得到的信息有关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
就打破它,在一步一个脚印,并在您需要从数据工作,通过和你需要什么数据。
Donnie,感谢您对思考过程的描述 - 这正是我真正想要的。如果代码没有调整,我会检查你的回复。 – BillB 2009-11-22 16:27:20
再次感谢所有人的回答。对于Group BY有点麻烦的其他人(为什么选择中的每个列都必须是该组的一部分),以下是一个很好的讨论: http://weblogs.sqlteam.com/jeffs/archive/2007/ 07/20/60261。aspx -BillB – BillB 2009-11-22 17:31:06