【问题标题】:SQL Query, Count with 0 countSQL查询,计数为0
【发布时间】:2010-09-07 09:31:24
【问题描述】:

我有三个表:page、attachment、page-attachment

我有这样的数据:

page
ID    NAME
1     first page
2     second page
3     third page
4     fourth page

attachment
ID    NAME
1     foo.word
2     test.xsl
3     mm.ppt

page-attachment
ID    PAGE-ID   ATTACHMENT-ID
1     2         1
2     2         2
3     3         3

我想获得每页的附件数量也可以在该数量为 0 时获得。我试过了:

select page.name, count(page-attachment.id) as attachmentsnumber 
from page 
    inner join page-attachment on page.id=page-id 
group by page.id

我得到这个输出:

NAME        ATTACHMENTSNUMBER
second page  2
third page   1

我想得到这个输出:

NAME        ATTACHMENTSNUMBER
first page   0
second page  2
third page   1
fourth page  0

如何获得 0 部分?

【问题讨论】:

    标签: sql count


    【解决方案1】:

    根据数据库,为了速度,您可以使用 UNION 命令。

    SQL 更长,但是,根据数据库,它通过将“计算存在的事物”和“计算不存在的事物”分开来加快处理速度。

    (
    select page.name, count(page-attachment.id) as attachmentsnumber 
    from page 
    inner join page-attachment on page.id=page-id 
    group by page.id
    )
    UNION
    (
    select page.name, 0 as attachmentsnumber 
    from page
    where page.id not in (
        select page-id from page-attachment)
    )   
    

    我需要此解决方案的数据库有超过一百万个附件中的 20 页。 UNION 让它在 13 秒内运行,而不是那么长,我感到无聊并尝试了另一种方式(在我杀死外连接和子查询方法之前的 60 秒以上)。

    【讨论】:

      【解决方案2】:

      使用这个:

      SELECT p.name,(
          SELECT COUNT(*) FROM [page-attachment] pa WHERE pa.[PAGE-ID] = p.id) as attachmentsnumber
      FROM page p
      

      【讨论】:

        【解决方案3】:

        这是另一个使用子查询的解决方案。

        SELECT
          p.name,
          (
            SELECT COUNT(*) FROM [page-attachment] pa
            WHERE pa.[PAGE-ID] = p.id
          ) as attachmentsnumber
        FROM page p
        

        【讨论】:

          【解决方案4】:

          将您的“内连接”更改为“左外连接”,这意味着“获取连接左侧的所有行,即使右侧没有匹配的行。”

          select page.name, count(page-attachment.id) as attachmentsnumber 
          from page 
              left outer join page-attachment on page.id=page-id 
          group by page.name
          

          【讨论】:

          • 正如 David B. 提到的,这个查询没有运行。将分组依据更改为“按 page.name 分组”
          【解决方案5】:

          LEFT 加入是你的朋友。 要了解有关不同联接类型的更多信息,请参阅http://en.wikipedia.org/wiki/Join_(SQL)

          【讨论】:

            【解决方案6】:

            你想要一个左连接,而不是一个内连接,因为它允许记录不存在。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-12-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-14
              相关资源
              最近更新 更多