我的老师有以下问题 7)博物馆要求所有考古学家的名字和姓氏,以及发现霸王龙恐龙的地点数量。请注意,有些考古学家没有发现任何恐龙,有些考古学家没有发现任何霸王龙恐龙,但仍应包括在列表中。
我在下面写的陈述只向我展示了发现了特雷克斯的考古学家。任何人都可以帮助我将问题中的所有信息包括在内吗?
<h2>Select Week Ending date </h2>
<input type="date" name="Weekendingdate">
<button onclick="myFunction()">Try it</button>
答案 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