SQL 查询连接无法正常工作

SQL Query Joins not working properly

对于一个项目,我需要为小型奥运会创建一个数据库。我的ER图如图所示... link 为了更好的图片:https://i.imgur.com/xgfurWO.png?1

我需要创建一个查询,其中仅包含参加多个赛事的参赛者(即只有两名参赛者),并列出名称、赛事、场地和结果。

下面的查询有效,因为它应该生成 70(# of competitions)条记录,对于参加两个项目的竞争对手,计数为 2...

SELECT c.firstname, c.lastname, COUNT(r.competitorid)
FROM  COMPETITOR c LEFT OUTER JOIN ( REGISTRATION r LEFT OUTER JOIN  EVENT e 
               ON r.eventid = e.eventid ) ON r.competitorid = c.competitorid
GROUP BY c.firstname, c.lastname
ORDER BY c.firstname;
-----------------------------------------
NORRIS  HOLMWOOD    1
OCTAVIO MARTINEZ    1
ORFEO   SILVA       2
etc...

在查询中包含事件名称后,它会产生 72 个结果,其中竞争对手在两次列出的两个事件中竞争,但 COUNT() 对所有内容都是 1。

SELECT c.firstname, c.lastname, e.eventname, COUNT(r.competitorid)
FROM  COMPETITOR c LEFT OUTER JOIN ( REGISTRATION r LEFT OUTER JOIN  EVENT e 
ON r.eventid = e.eventid ) ON r.competitorid = c.competitorid
GROUP BY c.firstname, c.lastname, e.eventname
ORDER BY c.firstname;
----------------------------------------------------------------
NORRIS  HOLMWOOD    100 METER BUTTERFLY 1
OCTAVIO MARTINEZ    FLOOR EXERCISE  1
ORFEO   SILVA   100 METER BUTTERFLY 1
ORFEO   SILVA   400 METER INDIV MEDLEY  1
PONCIO  ASIS    POMMEL HORSE    1
PONCIO  BARROS  LONG JUMP   1 

那么这就是事情真的搞砸了。当我将结果 table 与事件 table 连接时,输出与 72 条记录保持一致,但计数完全错误。

SELECT c.firstname, c.lastname, e.eventname, COUNT(r.competitorid)
FROM  COMPETITOR c LEFT OUTER JOIN ( REGISTRATION r LEFT OUTER JOIN (
    EVENT e right OUTER JOIN RESULT rs ON e.eventid = rs.eventid)
    ON r.eventid = e.eventid ) ON r.competitorid = c.competitorid
GROUP BY c.firstname, c.lastname, e.eventname
ORDER BY c.firstname;
-----------------------------------------------------------------------
NIKOLAI MIKHAILOV   POMMEL HORSE        6
NOEMI   PELAEZ  BALANCE BEAM            7
NORRIS  HOLMWOOD    100 METER BUTTERFLY 6
OCTAVIO MARTINEZ    FLOOR EXERCISE      6
ORFEO   SILVA   100 METER BUTTERFLY     6
ORFEO   SILVA   400 METER INDIV MEDLEY  6
PONCIO  ASIS    POMMEL HORSE            6

我的问题是我做错了什么?连接似乎至少部分地按照我希望的方式工作,问题在于搞砸了 count()。数字越大并不一定重要,问题是由于某种原因,计数似乎相当随机。

考虑:(结果 特定于竞争对手,因此您错过了该加入条件。) 此外,右连接意味着您需要结果中的所有记录和所有记录,因为其他表是左连接到竞争对手的。由于结果逻辑上是基于竞争对手的,我猜正确的连接是不正确的。

所以计数 1 的双重问题缺少连接标准导致计数膨胀,正确的连接 可能 也引起了问题,但由于结果取决于竞争对手,您可能看不到任何问题。

如果你想要一个参赛者注册的事件数量,你需要单独推导出那个计数[绝望的拼写错误太有趣了,无法删除]然后重新加入(还有其他方法,但我通常更喜欢这个方法,因为它似乎与数据库无关)

SELECT c.firstname, c.lastname, e.eventname, CE.TotalNumberOFEvents
FROM  COMPETITOR c 
LEFT OUTER JOIN REGISTRATION r 
  ON r.competitorid = c.competitorid
LEFT OUTER JOIN EVENT e 
  ON r.eventid = e.eventid 
LEFT OUTER JOIN RESULT rs    --Not sure why this is a right join... on your qry.
  ON e.eventid = rs.eventid
 AND Rs.CompetitorID = C.CompetitorID  ---ADDED this and removed the ()'s putting join critier under the joins. 
LEFT JOIN (SELECT count(RegistrationID) as TotalNumberOfEvents, CompetitorID 
           FROM Registration) as CE    --added this to get the # of events a competitor is in (independant of the event name listed)
  ON Ce.CompetitorID = C.CompetitorID
GROUP BY c.firstname, c.lastname, e.eventname
ORDER BY c.firstname;