SQL-запрос, который возвращает родительские записи независимо от наличия дочерних записей - PullRequest
0 голосов
/ 09 мая 2018

Мне нужна помощь в построении запроса, который возвращает родительские записи (из таблицы Meeting), независимо от наличия дочерних записей (из таблицы ActionItems). Я смог сделать это с помощью LEFT JOIN, но как только я добавил другие связанные таблицы (Участники и Категория), код не работал.

Вот структура моих таблиц:

enter image description here

Мне нужно отображать информацию о каждом собрании

  1. Поле CategoryId может быть пустым в таблице ActionItems. Мне нужно показать ActioItem, даже если CategoryId пусто

  2. Собрание может не иметь элементов действий, связанных с ним, необходимо возвращать записи собрания, даже если отсутствуют элементы ActionItems

Вот мой код, который не работает (мне может понадобиться сделать несколько запросов, что нормально):

SELECT  Members.FirtName
        , Members.LastName
        , Meeting.Notes
        , Meeting.Location
        , ActionItems.Details
        , ActionItems.CompleteByDate
        , Category.Name
FROM    Members INNER JOIN 
            (Meetings LEFT JOIN 
                (ActionItems INNER JOIN Category.Id = ActionItems.CategoryId) 
             ON Meeting.Id = ActionItems.MeetingId) 
        ON Members.Id = Meeting.MemberId;

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Все объединения в одной и той же "ветке" должны быть оставлены до конца цепочки. Таким образом, в этом случае все, что присоединилось к ActionItems, нужно оставить присоединенным. Ваш выбор должен работать так:

SELECT  Members.FirtName
        , Members.LastName
        , Meeting.Notes
        , Meeting.Location
        , ActionItems.Details
        , ActionItems.CompleteByDate
        , Category.Name
FROM    Members INNER JOIN 
            (Meetings LEFT JOIN 
                (ActionItems LEFT JOIN Category.Id = ActionItems.CategoryId) 
             ON Meeting.Id = ActionItems.MeetingId) 
        ON Members.Id = Meeting.MemberId;
0 голосов
/ 09 мая 2018

Обычно при использовании LEFT JOIN их необходимо объединять в цепочку, т. Е. Все объединения должны быть внешними объединениями.

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

SELECT mem.FirtName, mem.LastName, m.Notes, m.Location, ai.Details, 
ai.CompleteByDate, c.Name
FROM ((Meetings as m LEFT JOIN
       ActionItems as ai 
       ON m.Id = ai.MeetingId Members
      ) LEFT JOIN
      Category as c
      ON c.Id = ai.CategoryId
     ) LEFT JOIN
     Members mem
     ON mem.Id = m.MemberId;

Тем не менее, если для собрания имеется несколько элементов действий, то каждый участник будет дублироваться для каждого элемента действий.

...