Выборка из двух таблиц с учётом иных связей?
Как написать запрос, чтобы на выдачу получить такие колонки:
Grands_Prix.Round,
Grands_Prix.Title,
Grands_Prix.Country,
Grands_Prix_Racers.Position,
Racers.Name,
Teams.Title, если мне нужно, чтобы выдача была исключительно по одной команде?
Это или Teams.Title, или Teams.id (или Racers_Teams_Seasons.Teams_Id?) Я пытаюсь через Teams.id.
Вот такой запрос выдаёт очень странный результат: выводит каждую гонку любого гонщика, при этом выдаёт разные позиции на одну и ту же гонку, но всем исправно пишет одну и ту же команду, что неправда.
SELECT Grands_Prix.Round,
Grands_Prix.Title,
Grands_Prix.Country,
Grands_Prix_Racers.Position,
Racers.Name,
Teams.Title,
Teams.Id
FROM Grands_Prix, Grands_Prix_Racers, Racers, Teams
WHERE Teams.id = 6
На скрине ответа на запрос это не видно, но обратите внимание, что строк в ответе 693 120.
Всего в команде 2 гонщика, 38 гонок, значит, результатов по логике должно быть 76.
Ответы (1 шт):
В конечном итоге я запрос создал таким и он работает. Прошу прощения за глупые комменты, писал сам для себя.
SELECT
-- Берём Раунд (какое Гран-При по счёту), Автодром, Страну и Где автодром находится, Гонщика, \
-- его Финальную позицию и Команду
E.Round, E.Circuit, E.Country, E.Location, F.Name, F.Position, F.Title
FROM
Grands_Prix as E -- ЭТО ТАБЛИЦА Е!
-- Джойним (справа, по id Гран-При) таблицу Гран-при и F
RIGHT OUTER JOIN
(
SELECT
-- Берём id гонки (Гран-При), позицию пилота на финише, его имя и название команды
C.Grands_Prix_Id, C.Position, D.Name, D.Title
-- Джойним (справа, по id пилотов) таблицу связи Гран-При--пилотов \
-- с таблицей А (см. то, что в RIGHT OUTER JOIN)
FROM
Grands_Prix_Racers as C -- ЭТО ТАБЛИЦА С!
RIGHT OUTER JOIN
(
SELECT
-- Берём id пилота, его имя и название команды
A.Id, A.Name, B.Title
FROM
(
SELECT
-- Берём id пилота, его имя, id команды, сезон
Racers.Id, Racers.Name, Racers_Teams_Seasons.Teams_Id, Racers_Teams_Seasons.Seasons_Year
-- Джойним (справа, по id команд) таблицы гонщиков и таблицу связей гонщиков-коман-сезонов
FROM
Racers
RIGHT OUTER JOIN
Racers_Teams_Seasons
ON
Racers.Id = Racers_Teams_Seasons.Racer_Id
WHERE
-- по условию, сезон — 2020, Команда по id — 3 (Racing Point)
(Seasons_Year = 2020) AND (Teams_Id = 3)
) as A -- В СКОБКАХ — ЭТО ТАБЛИЦА А!
LEFT OUTER JOIN
Teams as B -- ЭТО ТАБЛИЦА В!
ON
A.Teams_Id = B.Id
) as D -- ЭТО ТАБЛИЦА D!
ON
C.Racers_Id = D.Id
WHERE
-- Берём Гран-При с id выше 21 \
-- В 2019 году было 21 Гран-При, следовательно, \
-- так берём все ГП 2020 года
-- [Я знаю, это косяк архитектуры. \
-- На будущее — перестать запрещать изменения в любых таблицах!])
C.Grands_Prix_Id > 21
) as F -- ЭТО ТАБЛИЦА F!
ON
E.Id = F.Grands_Prix_Id

