Oracle中的左外部联接和计数

时间:2019-02-10 20:45:06

标签: oracle

我的老师有以下问题 7)博物馆要求所有考古学家的名字和姓氏,以及发现霸王龙恐龙的地点数量。请注意,有些考古学家没有发现任何恐龙,有些考古学家没有发现任何霸王龙恐龙,但仍应包括在列表中。

我在下面写的陈述只向我展示了发现了特雷克斯的考古学家。任何人都可以帮助我将问题中的所有信息包括在内吗?

<h2>Select Week Ending date  </h2>  
<input type="date" name="Weekendingdate">
<button onclick="myFunction()">Try it</button>

2 个答案:

答案 0 :(得分:2)

我认为不需要外部联接来满足问题的要求。他们要求的唯一字段是名字和姓氏以及计数。...无需输出恐龙名称或位置,这意味着您可以使用下面的列表获取所需的列表。

SELECT ARC.FIRST_NAME, ARC.LAST_NAME, (select count(distinct loc.LOCATION_ID) 
                                                      from DISCOVERY dis
                                                      inner join LOCATION loc on dis.location_id = loc.location_id
                                                      inner join DINOSAUR din on din.DINO_ID = dis.DINO_ID
                                                      where ARC.ARCH_ID = dis.ARCH_ID
                                                      and DIS.DINO_ID = 123) as loc_disc_TREX
FROM ARCHEOLOGIST ARC;

答案 1 :(得分:0)

我建议这样的事情:

SELECT a.first_name, a.last_name,
       COUNT(DISTINCT ds.location_id) AS locations_with_t_rex_found
  FROM archeologist a
  LEFT OUTER JOIN discovery ds
    ON ds.arch_id = a.arch_id
   AND ds.dino_id = 123
 GROUP BY a.first_name, a.last_name
 ORDER BY locations_with_t_rex_found DESC, a.first_name, a.last_name

结果是:

FIRST_NAME | LAST_NAME | LOCATIONS_WITH_T_REX_FOUND
-----------+-----------+---------------------------
Ernest     | Hemingway |                          2
Ayn        | Rand      |                          1
Fred       | Astaire   |                          0
Ginger     | Rogers    |                          0
Greta      | Garbo     |                          0

看看这个db<>fiddle,看看它的作用。 (我已经调整了样本数据,因为您似乎在插入物中将所有恐龙条目命名为“ TYRANNOSAURUS REX”,而以前您发布的内容更加多样化。)

与问题的原始查询相比,关键的区别(除了跳过一些表)是在左联接匹配条件中指定恐龙种类过滤条件,而不是在整个WHERE子句中指定(只限制联接表,而不是整个结果。

correlated subquery solution中的@Shaun Peterson相比,这种方法还可以使您轻松获得其他“统计信息”,例如为了还返回实际发现的计数(例如,在一个位置覆盖多个发现),您只需添加例如COUNT(ds.disc_id)到列表达式列表。

关于跳过表:
您不需要引用LOCATION表,因为您不需要位置名称,并且可以基于LOCATION_ID表中的DISCOVERY计算不同的位置计数。您也不需要查询中的DINOSAUR表,除非您要根据恐龙名称而不是恐龙ID筛选霸王龙。 要添加回表,您需要谨慎加入。这应该起作用:

SELECT a.first_name, a.last_name,
       COUNT(DISTINCT ds.location_id) AS locations_with_t_rex_found
  FROM archeologist a
  LEFT OUTER JOIN (discovery ds
             INNER JOIN dinosaur dn ON ds.dino_id = dn.dino_id)
    ON ds.arch_id = a.arch_id
   AND dn.dino_name = 'Tyrannosaurus Rex'
 GROUP BY a.first_name, a.last_name
 ORDER BY locations_with_t_rex_found DESC, a.first_name, a.last_name