SQL-запрос не уверен, как сопоставить различные значения из одной таблицы - PullRequest
1 голос
/ 23 мая 2019

У меня есть несколько таблиц, которые я пытаюсь получить информацию в кратком запросе.

Пример:


Таблица класса

ID | Name_ID |  Class | Teacher | Student
1       1         1       N         Y
2       2         1       N         Y
3       3         1       Y         N
4       4         2       N         Y
5       5         2       N         Y
6       5         2       Y         N
7       2         3       Y         N

Таблица учеников

ID  |  First_Name  |  Last_Name |
1      Tom            Smith
2      Mike           Collins
3      Chris          Stewart
4      Paul           McCartney
5      Ringo          Starr

Преподаватели таблицы

ID  |  First_Name   | Last_Name |
1      First          Teacher
2      Second         Teacher
3      Becky          Camp
4      Fourth         Teacher
5      Mike           Brazil

Мой сценарий выглядит следующим образом:

select c.id, s.first_name + ' ' + s.last_name as 'Student Name', t.first_name + ' ' + t.last_name as 'Teacher Name'
from class c
left join students s on c.name_id = s.id and c.Student = 'Y'
left join teachers t on c.name_id = t.id and c.Teacher = 'Y'

Причина, по которой я выполняю левое соединение, заключается в том, чтов моей полной базе данных есть несколько классов без учеников, и есть некоторые классы без учителей.Если я выполняю внутреннее соединение, я пропускаю группу идентификаторов классов, которые не соответствуют обоим критериям.Но левое соединение вызывает дублирование строк и заполнение значений NULL для одного или другого.

Результат, которого я пытаюсь достичь, - это список всех учеников и учителей для каждого класса.Примерно так:

Class | Student Name   |  Teacher Name  |
1       Tom Smith         Becky Camp
1       Mike Collins      Becky Camp
2       Paul McCartney    Mike Brazil
2       Ringo Starr       Mike Brazil
3       NULL              Second Teacher

В моей полной базе данных есть некоторые классы без каких-либо учеников (только для учителей) и некоторые классы без учителей (только для учеников), как я могу объединить эти таблицы без дубликатов?и все еще получить NULL для классов, которые не соответствуют ни учащимся, ни учителям?

Вот что я получаю:

Class | Student Name   |  Teacher Name  |
1       Tom Smith         Becky Camp
1       NULL              Becky Camp
1       Mike Collins      NULL
1       Mike Collins      Becky Camp
1       NULL              Becky Camp
1       Tom Smith         NULL
2       Paul McCartney    Mike Brazil
2       NULL              Mike Brazil
2       Paul McCartney    NULL
2       Ringo Starr       Mike Brazil  
2       NULL              Mike Brazil
2       Ringo Starr       NULL

1 Ответ

0 голосов
/ 23 мая 2019

Вы можете разделить это на 3 части:

-- inner join query
(select c.id, s.first_name + ' ' + s.last_name as 'Student Name', t.first_name + ' ' + t.last_name as 'Teacher Name'
from class c
 join students s on c.name_id = s.id and c.Student = 'Y'
 join teachers t on c.name_id = t.id and c.Teacher = 'Y')
-- 1st left join query
union all
(select * from (
select c.id, s.first_name + ' ' + s.last_name as 'Student Name', t.first_name + ' ' + t.last_name as 'Teacher Name'
from class c
left join students s on c.name_id = s.id and c.Student = 'Y'
left join teachers t on c.name_id = t.id and c.Teacher = 'Y') q
where "Student Name" is null)
-- 2nd left join query
union all
(select * from (
select c.id, s.first_name + ' ' + s.last_name as 'Student Name', t.first_name + ' ' + t.last_name as 'Teacher Name'
from class c
left join students s on c.name_id = s.id and c.Student = 'Y'
left join teachers t on c.name_id = t.id and c.Teacher = 'Y') qq
where "Teacher Name" is null)

Первый, если для ненулевого

2-й для нулевых студентов

3-й - для нулевых учителей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...