SQL—外键在表中出现的次数计数

SQL—外键在表中出现的次数计数,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,架构信息: 涉及3个表格:瞄准、观察和组织 通过FK SpotterId观测参考点观测员 观察员通过FK OrgId引用组织 我希望查询返回两列;一个用于ORG.OrgName列表,另一个用于相应ORG.OrgID在目击中出现的观察员ID总数 我在下面所做的操作将返回返回的每一行的错误计数: SELECT ORG.ORG_NAME AS ORG_NAME, (SELECT COUNT(SIGHTINGS.SPOTTER_ID) FROM SIGHTINGS

架构信息:

涉及3个表格:瞄准、观察和组织

通过FK SpotterId观测参考点观测员

观察员通过FK OrgId引用组织

我希望查询返回两列;一个用于ORG.OrgName列表,另一个用于相应ORG.OrgID在目击中出现的观察员ID总数

我在下面所做的操作将返回返回的每一行的错误计数:

SELECT ORG.ORG_NAME AS ORG_NAME,
       (SELECT COUNT(SIGHTINGS.SPOTTER_ID) 
          FROM SIGHTINGS
             , SPOTTERS 
         WHERE SIGHTINGS.SPOTTER_ID = SPOTTERS.SPOTTER_ID 
          AND SPOTTERS.ORG_ID=ORG.ORG_ID) AS ORG_COUNT 
  FROM ORG;

似乎您只需要聚合:

  SELECT COUNT(1), orgName
    FROM SIGHTING
         INNER JOIN SPOTTER USING (spotterId)
         INNER JOIN ORG USING (orgId)
GROUP BY orgName

这是一个简单的聚合,但您只需要一个
JOIN

select o.orgname, count(*) as numSpotters
from org o join
     spotters s
     on o.orgId = s.orgId
group by o.orgname;

注意:如果您想要所有组织,即使是那些没有观察员的组织,请使用
左加入
而不是
加入

请避免发布图像;发布DDL语句可以更好地解释表结构。另外,请发布一些示例数据和所需结果,为什么
count(1)
?(如果该链接将您带到页面顶部,请搜索“最终-结论性证据”)此功能非常有效。它也比我贴出的答案干净得多。谢谢。@Boneist-我可能弄错了,但优化器是否会自动且超快速地将
count(1)
转换为
count(*)
,至少在较新版本的Oracle中是这样?15年前写这篇文章时,情况可能并非如此。仍然没有理由写
count(1)
,但是我以前听过这个论点,我觉得它不是很有说服力(也许再也没有了)。@mathguy这是一个开玩笑的评论-你看过我发布的链接了吗?不幸的是,我不小心忘了给我的手机添加一个笑脸comment@Boneist-正如汤姆所说:“ROTFL:)谢谢(一开始,我是认真阅读的……”。。我的同伴很好:)要求从目击表中计数(也就是说,计算属于某个组织的观察者的目击次数),而不是计算观察者本身。这就是为什么需要两个连接。@mathguy。事实上,这个问题是含糊不清的:“另一个用于各自的观察员ID总数”。我可能认为这是不同的计数。@user3603179-请阅读Gordon回答的两条注释(就在这条上面)-您需要澄清作业。戈登是对的,你的措辞可以用任何一种方式来解释。如果观察者在观察表中出现四次,那么在您的要求中,这算是“一”还是“四”?@mathguy很抱歉不清楚,但从您的示例来看,出现四次的观察者会将计数加上4。