这是架构:
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)
你能告诉我为什么它是错的,并帮我纠正它!
这个:
SELECT battles.name
FROM battles,
outcomes,
ships,
classes
WHERE outcomes.ship = ships.name
Run Code Online (Sandbox Code Playgroud)
...根本性的缺陷,因为只有加入之间的标准OUTCOMES和SHIPS.结果是笛卡尔积.它是有效的 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)