链接连接的麻烦

时间:2009-11-22 01:09:13

标签: sql join

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

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。

非常感谢您的帮助 比尔

5 个答案:

答案 0 :(得分: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

我添加了COALESCE来处理文章没有评论的时候 - 虽然你没有提到你正在使用的文章,但它在Oracle和SQL Server中都是安全的。据我所知,由于WITH子句,它只能是SQL Server,Oracle或DB2。

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:1)

他是我在构建查询时经历的过程:

首先,主要的驾驶表是什么?对于您,您获得了有关articles的信息,因此建议使用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

只需将其分解,一步一步,完成从中获取数据的位置,以及所需的数据。