Запрос «один ко многим» с таблицами поиска и ссылок

#sql #sql-server #sql-server-express

#sql #sql-сервер #sql-server-express

Вопрос:

Мой текущий тест вращается вокруг гипотетической базы данных, состоящей из Person таблицы, которая преимущественно заполнена идентификаторами из таблиц поиска.

У меня также есть Training таблица, в которой также есть Id ссылка на Course таблицу. Я создал таблицу ссылок PersonTraining , которая связывает таблицы Person and Training через их соответствующие идентификаторы. См. Изображение

Моя цель — запрос, который вернет таблицу результатов.

Я могу создать запрос, который возвращает Person таблицу со всеми идентификаторами, замененными соответствующими значениями таблицы поиска. По сути, это приведенное ниже, и, надеюсь, это правильный метод?

 Select 
    PersonId, Name, [DepartmentTable].Department, [PayTable].Pay 
From 
    [PersonTable]
Left Join 
    [DepartmentTable] on [PersonTable].DepartmentId = [DepartmentTable]. DepartmentIdLeft 
Join 
    [PayTable] on [PersonTable]. PayId = [PayTable]. PayId
 

Однако я не могу понять, как вернуть это вместе с названиями курсов, которые они посещали.

Смотрите Изображение результатов

Любая помощь будет высоко оценена

Ответ №1:

Не совсем понятно, в чем разница между «обучением» и «курсом» … это две отдельные таблицы? С отношением 1: 1?

Но если предположить, что вы хотите расширить свой существующий запрос, чтобы также включить ссылку m: n из Person to Training — попробуйте это:

 Select 
    p.PersonId, p.Name, d.Department, pay.Pay,
    c.CourseName
From 
    dbo.[PersonTable] p
Left Outer Join 
    dbo.[DepartmentTable] d on p.DepartmentId = d.DepartmentId
Inner Join 
    dbo.[PayTable] pay on p.PayId = pay.PayId
-- do a left join to the association table - not every person will have a training
Left Outer Join 
    dbo.PersonTrainingTable pt on p.PersonId = pt.PersonId
-- do a left join to the training table
Left Outer Join 
    dbo.TrainingTable t on pt.TrainingId = t.TrainingId
Left Outer Join
    dbo.CourseTable c on t.CourseId = c.CourseId
 

Обновлено: добавлено CourseTable и обязательно использовало имеющиеся у вас имена (но почему вы вызываете каждую таблицу AbcTable — ясно, что это таблица, этот суффикс не добавляет никакого дополнительного значения вообще ..)

Комментарии:

1. Спасибо за ваш ответ, и вы задаете вопрос о разнице между таблицами «Обучение» и «Курс», поскольку это заставило меня понять, что произошла ошибка, которую я сейчас исправил в изображении. Я попробовал предложенное вами решение и сожалею, что оно не сработало, но это, вероятно, связано с моей первоначальной ошибкой.

2. Очень ценится, что это работает с одной незначительной поправкой Строка 7 «d.DepartmentIdLeft», я полагаю, должна читать «d.DepartmentID»