Как отобразить два столбца с несколькими значениями и разделить вхождения с помощью предложения WHERE - PullRequest
0 голосов
/ 16 февраля 2020

Это мой запрос SQL. Я пытаюсь выбрать имена сотрудников из таблицы сотрудников «T» в качестве инструктора и «S» в качестве студента. Где каждый студент связан с тренером.

SQL запрос:

SELECT
    cc.CourseName,
    FORMAT(cs.StartDate, 'dd/MM/yyyy') AS 'Start Date',
    FORMAT(cs.EndDate, 'dd/MM/yyyy') AS 'End Date',
    a.AcademyName,
    r.RoomName,
    (SELECT e.FirstName + ' ' + e.LastName WHERE e.EmployeeType = 'T') AS 'Trainer',
    (SELECT e.FirstName + ' ' + e.LastName WHERE e.EmployeeType = 'S') AS 'Student'
FROM 
    Employees e
INNER JOIN 
    CourseScheduleTrainers cst ON e.EmployeeID = cst.EmployeeID
INNER JOIN 
    CourseScheduleAttendees csa ON cst.TrainerID = csa.TrainerID
INNER JOIN 
    CourseCatalog cc ON csa.CourseCatalogID = cc.CourseCatalogID
INNER JOIN 
    CourseSchedule cs ON cc.CourseScheduleID = cs.CourseScheduleID
INNER JOIN 
    Rooms r ON cs.RoomsID = r.RoomsID
INNER JOIN 
    Academies a ON r.AcademyID = a.AcademyID;

Вот что он возвращает:

enter image description here

И это ERD базы данных, которую я пытаюсь создать. По сути, участников курса можно также классифицировать как сотрудников, и они помечаются с использованием типа сотрудника

Диаграмма отношений между сущностями:

enter image description here

Я думал, это был простой случай подзапроса, но, похоже, он не работает.

1 Ответ

1 голос
/ 16 февраля 2020

Подумайте о том, чтобы присоединиться к Сотрудникам дважды и изменить порядок пунктов FROM и JOIN, чтобы начать с основной гранулярной таблицы, CourseScheduleAttendees , где другие таблицы служат поисками в виде спиц:

SELECT cc.CourseName
       ,FORMAT(cs.StartDate, 'dd/MM/yyyy') AS 'Start Date' 
       ,FORMAT(cs.EndDate, 'dd/MM/yyyy') AS 'End Date' 
       ,a.AcademyName 
       ,r.RoomName
       ,t.FirstName + ' ' + t.LastName AS 'Trainer' 
       ,s.FirstName + ' ' + s.LastName AS 'Student' 
FROM CourseScheduleAttendees csa
INNER JOIN CourseScheduleTrainers cst
   ON csa.TrainerID = cst.TrainerID  
INNER JOIN Employees t
   ON cst.EmployeeID = t.EmployeeID 
   AND t.EmployeeType = 'T'
INNER JOIN Employees s
   ON csa.AttendeeID = s.EmployeeID 
   AND s.EmployeeType = 'S'
INNER JOIN CourseCatalog cc 
   ON csa.CourseCatalogID = cc.CourseCatalogID 
INNER JOIN CourseSchedule cs 
   ON cc.CourseScheduleID = cs.CourseScheduleID 
INNER JOIN Rooms r 
   ON cs.RoomsID = r.RoomsID 
INNER JOIN Academies a 
   ON r.AcademyID = a.AcademyID;
...