Как объединить две таблицы в SQL сервере - PullRequest
0 голосов
/ 30 мая 2020

У меня есть эти две таблицы:

Таблица 1

Date          Name         StudentID          TotalDuration
------------------------------------------------------------
2019-09-30    aA           11111              100
2019-09-30    bB           22222              40
2019-09-30    cC           33333              60
2019-10-07    aA           11111              50
2019-10-07    bB           22222              10
2019-10-07    cC           33333              12
2019-10-07    dD           44444              90

Она содержит данные о студентах, которые ПРИСУТСТВОВАЛИ на лекции (следовательно, не включает тех, кто не присутствовал.

Таблица 2

StudentID          Surname         FirstName          Group
------------------------------------------------------------
11111              A               a                  1
22222              B               b                  1
33333              C               c                  1
44444              D               d                  2
55555              E               e                  2
66666              F               f                  2
77777              G               g                  3

Таблица2 содержит данные ВСЕХ учеников в классе.

Атрибут имени в таблице 1 представляет собой комбинацию фамилии + имени, а TotalDuration - продолжительность участия студента в минут.

Я хочу объединить эти две таблицы, чтобы в них были перечислены все ученики в классе и их общая продолжительность.

Я пробовал OUTER JOIN и UNION ALL, но не могу понять как я могу перечислить всех студентов, но показывает значение NULL для тех студентов, которые не посещали лекцию в определенный день.

Как я могу этого добиться?

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Вы можете left join и group by. Но поскольку вам нужно всего лишь одно агрегированное вычисление, коррелированный подзапрос, вероятно, является более простым и эффективным подходом (если у вас есть правильный индекс - см. Ниже):

select 
    t2.*,
    (
        select sum(totalduration) 
        from table1 t1 
        where t1.studentid = t2.studentid
    ) totalduration
from table2 t2

Для производительности рассмотрите индекс на table1(studentid, totalduration).

Примечание: с точки зрения дизайна базы данных столбец Name в table1 просто не нужен; это дополнительная информация, которая усложняет задачу обслуживания (что, если кто-то изменит имя студента в другой таблице?). Вам следует удалить этот столбец и полагаться на внешний ключ только на studentid.

0 голосов
/ 30 мая 2020

Вероятно, вы захотите агрегировать результат по StudentID и использовать LEFT JOIN, например:

select
  a.StudentId,
  a.FirstName,
  a.Surname,
  a.Group,
  sum(b.TotalDuration) as total_duration
from table2 a
left join table1 b on b.StudentId = a.StudentId
group by a.StudentId

Обратите внимание, что группировка по a.FirstName и a.Surname (при условии, что StudentId первичный ключ) не является обязательным согласно стандарту SQL. Я не уверен, что это потребуется серверу SQL.

...