2013-10-03 2 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 тонн. Типичный кортеж для Сражений:

('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 не знает, какое имя и корабль вы ищете .. try: 'SELECT a.country, b.country с кораблей a, корабли b, сражения b1, сражения b2 WHERE a.name = b1.ship и b1 .battleName = b2.battleName и a.country> b.country' –

ответ

4

Ну, name = ship есть проблема. name может быть от a или b и ship из b1 или b2

вы могли бы сделать что-то подобное:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^