【问题标题】:SQL query count elements in other tableSQL查询计数其他表中的元素
【发布时间】:2013-07-25 17:26:02
【问题描述】:

我有两个 SQL 表,Projects 和 Milestones:

项目 PK -> ProID

里程碑组合 PK -> ProID 和 MstNo

由于某种原因,我不能使用 ProID 作为外键将这两个表链接在一起(FOREIGN KEY 约束)。但是,我需要编写一个查询来显示所有 Projects 表记录的详细信息,以及每个项目的一些里程碑。我可以使用内部联接以某种方式实现这一目标吗?我不擅长编写 SQL 查询。

【问题讨论】:

  • 您在尝试设置外键约束时遇到了什么样的错误/问题?
  • 回答你的问题Can I use inner join to achieve that somehow?YES

标签: sql sql-server relational-database


【解决方案1】:

试试这个 -

SELECT 
       P.*
     , cnt = ISNULL(M.cnt, 0)
FROM dbo.Projects P
LEFT JOIN (
     SELECT ProID, cnt = COUNT(1) 
     FROM dbo.Milestones
     GROUP BY ProID
) M ON M.ProID = P.ProID

【讨论】:

    【解决方案2】:

    是的,你可以。 inner join 在声明的条件下将一个表中的数据与另一个表匹配。

    select * from Projects inner join Milestones on Projects.ProId = Milestones.ProID

    此查询将从Projects 表中读取所有数据并将Milestones 中的数据与它匹配。

    在结果中,您将在两个表中都有具有 ProId 的实体。

    【讨论】:

      【解决方案3】:
      SELECT P.ProID ,
             COUNT(M.*)
      FROM   Projects P
             LEFT JOIN Milestones M
                 ON M.ProID = P.ProID
      GROUP BY P.ProID 
      

      【讨论】:

        【解决方案4】:

        如果我有表格结构,你应该写类似

        SELECT
          ProID,
          count(*) as MstNo
        FROM projects
        LEFT JOIN milestones ON projects.ProID=milestones.ProID
        GROUP BY ProID
        

        更好

        SELECT
          ProID,
          sum(
            CASE WHEN milestones.ProID is null THEN 0 ELSE 1 END
          ) as MstNo
        FROM projects
        LEFT JOIN milestones ON projects.ProID=milestones.ProID
        GROUP BY ProID
        

        通过这种方式,您将没有里程碑的项目计数为 0

        【讨论】:

          猜你喜欢
          • 2021-12-19
          • 1970-01-01
          • 2016-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多