Как создать SQL-запрос, который может фильтровать по количеству? - PullRequest
0 голосов
/ 20 декабря 2009

Краткое описание базы данных "Корабли":

База данных кораблей, участвовавших во Второй мировой войне, находится на рассмотрении. База данных имеет следующие отношения:

  • Классы (класс, тип, страна, numGuns, отверстие, смещение)
  • Корабли (название, класс, спущены на воду)
  • Сражения (имя, дата)
  • Исходы (корабль, битва, результат)

Корабли в классах организованы в один проект. Классу обычно присваивается имя первого корабля в рассматриваемом классе (головной корабль); в противном случае имя класса не совпадает с именем корабля в базе данных.

Отношение классов включает в себя имя класса, тип (bb для боевого корабля или bc для боевого крейсера), страну, в которой был построен корабль, количество основных пушек, калибр пушки (диаметр ствола пушки, в дюймах ) и смещение (вес в тоннах).

Отношение Корабли включает в себя название корабля, название класса и год запуска. Отношение Battles охватывает название и дату битвы, в которой участвовали корабли; в то время как результат их участия в битве (потоплен, поврежден или невредим - все в порядке) находится в отношении исходов. Примечание: отношение Outcomes может включать корабли, не включенные в отношение Ships.

Укажите сражения, в которых участвовали как минимум три корабля из одной страны.

Может кто-нибудь помочь с этим запросом? Я давно не пользовался SQL.

Редактировать

Как мне сказали, не разрешено задавать широкий вопрос, я буду более конкретным:

Я думал о том, как я могу это сделать, но в конце концов мне нужен какой-то способ подсчета дубликатов? например, за список

если я скажу count> 2, я получу a и c

Имя б б с с с

Ответы [ 2 ]

1 голос
/ 20 декабря 2009

Попробуйте это

SELECT *
FROM   Battles b
WHERE  EXISTS (
       SELECT     NULL
       FROM       Outcomes   o            
       INNER JOIN Ships      s
       ON         o.ship   = s.name
       INNER JOIN Classes    c
       ON         s.class  = c.class
       WHERE      o.battle = b.name
       GROUP BY   c.country
       HAVING     count(*) >= 3
   )
0 голосов
/ 20 декабря 2009

Я не все понимаю в вашем описании, но давайте начнем с этого. Это достаточно близко? Не совсем уверен, что означает "... Outcomes relation may include the ships not included in the Ships relation". Надеюсь, это поможет вам начать.

ship_model_01

SELECT DISTINCT b.[Name] AS [Battle Name]
FROM    Class AS c
        JOIN Ship AS s ON s.ClassID = c.ClassID
        JOIN Outcome AS o ON o.ShipID = s.ShipID
        JOIN Battle AS b ON b.BattleID = o.BattleID
GROUP BY b.[Name], c.Country
HAVING  COUNT(c.Country) >= 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...