Выборка из двух таблиц с учётом иных связей?

Есть вот такая БД Схема БД

Как написать запрос, чтобы на выдачу получить такие колонки: 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
→ Ссылка