2013-10-03 54 views
2

这是一个关于战舰和他们战斗的战斗模式:战斗,船舶SQL查询

Ships(name, yearLaunched, country, numGuns, gunSize, displacement) 
Battles(ship, battleName, result) 

典型船舶元组是:

('New Jersey', 1943, 'USA', 9, 16, 46000) 

这意味着,战舰新泽西是1943年推出;它属于美国,携带9口大小16英寸(内径或内径)的枪支,并加权(以航海术语计算)46,000吨。一个典型的Battles元组是:

('Hood', 'North Atlantic', 'sunk') 

也就是说,H.M.S.胡德在北大西洋的战斗中沉没。其他可能的结果是'好的'和'损坏的'

问题:列出所有在战斗中相互作战的国家对。每对只有一次名单,并与至上按字母顺序排列第一

回答全国一一列举:我写了这个:

SELECT 
    a.country, b.country 
FROM 
    ships a, ships b, battles b1, battles b2 
WHERE 
    name = ship 
    and b1.battleName = b2.battleName 
    and a.country > b.country 

但它说,不明确的列名。我如何解决它?在此先感谢

+3

好,'name = ship'就是问题。名字可能来自a或b,并且从b1或b2出货 –

+0

在您的WHERE子句中,'name = ship'需要合格。另外,在同一场战斗中,你如何区分战场上的敌对国家和盟国? – RBarryYoung

+0

SQL不知道你正在寻找哪个名字和船。尝试:'SELECT a.country,b.country from ships a,ships b,battles b1,battles b2 WHERE a.name = b1.ship and b1 .battleName = b2.battleName和a.country> b.country' –

回答

4

那么,name = ship是问题。 name可能是从ab,并shipb1b2

你可以做这样的事情:

select distinct s1.country, s2.country 
from ships s1 
inner join Battles b1 on b.ship = s1.name 
inner join Battles b2 on b2.ship <> s1.name and b2.battleName = b1.battleName 
inner join ships s2 on s2.name = b2.ship and s2.country < s1.country 
1

你能尝试嵌套查询得到的赢家和输家的表,然后将它们连接战斗名称?

SELECT 
WINNER.country as Country1 
,LOSER.country as Country2 

FROM 
(
    SELECT DISTINCT country, battleName 
    FROM Battles 
    INNER JOIN Ships ON Battles.ship = Ships.name 
    WHERE Battles.Result = 1 
) AS WINNER 

INNER JOIN 
(
    SELECT DISTINCT country, battleName 
    FROM Battles 
    INNER JOIN Ships ON Battles.ship = Ships.name 
    WHERE Battles.Result = 0 
) AS LOSER 

ON WINNER.battlename = LOSER.battlename 
ORDER BY WINNER.country