T- SQL Как вывести список строк, отсутствующих в таблице, на основе столбцов из других таблиц - PullRequest
0 голосов
/ 10 января 2020

Требуется некоторая помощь в том, что, вероятно, является довольно простой проблемой, но из-за этой формулировки мне трудно определить, был ли задан похожий вопрос.

На SQL Сервер У меня 3 таблицы:

  • Colleague (ColleagueID (INT), Name (NVARCHAR), Branch)
  • Module (ModuleID (INT), Course (NVARCHAR), DueDate)
  • ModuleCompletion (RecordID (INT), Colleague (NVARCHAR), Module (NVARCHAR)

Это быстро построенный набор таблиц, основанный на ранее собранные данные, которые компания хранила в Excel, например, Матрица рабочего листа (Коллеги вниз Y) и (Модули по X) и 1 для выполненных и 0 для не завершенных.

Я взял все 1 и загрузил их в таблицу ModuleCompletion, чтобы отследить, кто что закончил.
В настоящее время нет внешних ключей, связывающих таблицы, и нет UNIQUES et c.

Примеры таблиц:

Коллега

ID   Name  Branch  
-----------------
1    xyz    HO  
2    abc    HO  
3    tuv    HO  
4    efg    Branch1

Модуль

ID   Course  DueDate  
-----------------------
1    Co1     2019-12-31  
2    Co2     2020-01-30  

ModuleCompletion

ID   Colleague  Module
-----------------------
1    xyz        Co1
2    xyz        Co2
3    abc        Co1
4    tuv        Co2

Я надеюсь получить следующее:

Module  Branch   Colleague
--------------------------
Co1     HO       tuv
Co1     Branch1  efg
Co2     HO       abc
Co2     Branch1  efg

Результирующий набор должен содержать каждую комбинацию филиала и коллеги, не указанную в модуле в * 1041. * table.

Использование:

SELECT c.Branch, c.Name
FROM Colleague c
LEFT JOIN ModuleCompletion x ON x.Colleague = c.Name 
WHERE x.Colleague IS NULL
ORDER BY c.Branch, c.Name

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

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Основываясь на предыдущем решении и во избежание вложенного выбора, вы также можете сделать что-то подобное:

SELECT m.Course, c.Branch, c.Name 
  FROM Collegue     as c
 CROSS JOIN Module  as m
EXCEPT 
SELECT m.Course, c.Branch, c.Name
  FROM ModuleCompletion as mc
 INNER JOIN Collegue    as c 
         ON c.Name      = mc.Colleague
 INNER JOIN Module      as m
         ON m.Course    = mc.Module
0 голосов
/ 10 января 2020

Не оставляйте соединение, но перекрестное соединение.

from Colleague c
cross join Module m
where not exists (
  select *
  from ModuleCompletion mc
  where c.Name   = mc.Colleague
  and   m.Course = mc.Module
)

В основном вы можете играть отсюда

...