在SQL中练习WHERE和HAVING

l--*_*''' 1 sql

这是架构:

alt text http://img30.imageshack.us/img30/3324/123vk.jpg

这是一个问题:

指出来自同一国家的至少三艘船参加的战斗.

这是我的答案:

  SELECT battles.name 
    FROM battles,
         outcomes,
         ships,
         classes 
   WHERE outcomes.ship = ships.name 
GROUP BY battles.name 
  HAVING COUNT(classes.country) >= 3;
Run Code Online (Sandbox Code Playgroud)

你能告诉我为什么它是错的,并帮我纠正它!

OMG*_*ies 5

这个:

SELECT battles.name 
  FROM battles,
       outcomes,
       ships,
       classes 
 WHERE outcomes.ship = ships.name 
Run Code Online (Sandbox Code Playgroud)

...根本性的缺陷,因为只有加入之间的标准OUTCOMESSHIPS.结果是笛卡尔积.它是有效的 ANSI-89语法,但不会返回类似于您期望的结果集.

如果您只想要战斗"名称",请使用:

  SELECT o.battle
    FROM OUTCOMES o
    JOIN SHIPS s ON s.name = o.ship
    JOIN CLASSES c ON c.class = s.class
GROUP BY o.battle
  HAVING COUNT(c.country) >= 3
Run Code Online (Sandbox Code Playgroud)

如果您想要战斗表详细信息,请使用:

SELECT b.*
 FROM BATTLES b
 JOIN (SELECT o.battle
         FROM OUTCOMES o
         JOIN SHIPS s ON s.name = o.ship
         JOIN CLASSES c ON c.class = s.class
     GROUP BY o.battle
       HAVING COUNT(c.country) >= 3) x ON x.battle = b.name
Run Code Online (Sandbox Code Playgroud)