代码之家  ›  专栏  ›  技术社区  ›  BillB

链接连接有问题

  •  1
  • BillB  · 技术社区  · 16 年前

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

    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
    

    我该怎么写?我正在寻找一种方法来消除结果集和结果集上的选择。

    谢谢你的帮助 比尔

    5 回复  |  直到 16 年前
        1
  •  2
  •   OMG Ponies    16 年前

    您的查询 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。

        2
  •  1
  •   eKek0    16 年前
    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
  •   fyjham    16 年前

    如果我理解你是对的,你只是在追求:

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

    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
  •   Reverend Gonzo    16 年前

    关闭…

    您可以取出内部选择:

    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
    
        5
  •  1
  •   Donnie    16 年前

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

    首先,什么是主驾驶台?对你来说,你得到的信息是 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
    

    只需一步一步地将其分解,并完成从何处获取数据以及需要什么数据的工作。