Соединение двух таблиц с последующим извлечением несопоставленных записей из третьей таблицы
У меня Visual Studio 2005 и я пишу код на VB, а не на C+. Мне нужно утверждение Select, и я нашел некоторые из них, которые близки, но не соответствуют моей ситуации. У меня есть три таблицы:
PROJECT
[Projnum]
[ShipDate]
CUSTOMER
[Projnum]
[Jobnum]
TAGS
[Jobnum]
Мне нужно присоединиться к CUSTOMER и PROJECT, чтобы я знал все записи CUSTOMER.Jobnum, где PROJECT.ShipDate имеет значение null. Из этих записей мне нужно узнать, какие из них не совпадают с TAGS.Jobnum.
Любая помощь приветствуется. Большое спасибо, Чак.
3 ответа
LEFT JOIN
может быть быстрее, чем NOT IN
а также NOT EXISTS
,
SELECT c.JobNUm
FROM Project p
INNER JOIN Customer c
ON c.ProjNum = p.ProjNum
LEFT JOIN tags t ON t.jobnum=c.jobnum
WHERE p.ShipDate is null AND t.jobnum IS NULL
Если я правильно понимаю:
PROJECT
ProjNum
ShipDate
CUSTOMER
ProjNum
JobNum
TAGS
JobNum
И вы хотите все неиспользованные проекты:
SELECT c.JobNUm
FROM Project p
INNER JOIN Customer c
ON c.ProjNum = p.ProjNum
WHERE p.ShipDate is null
И тогда вы хотите, чтобы те без JobNum в таблице TAGS:
SELECT c.JobNUm
FROM Project p
INNER JOIN Customer c
ON c.ProjNum = p.ProjNum
WHERE p.ShipDate is null
AND c.JobNum NOT IN (SELECT JobNum from TAGS)
Можно было сделать проще, но я хотел показать свою работу.
SELECT c.Jobnum
FROM customer c
INNER JOIN project p
ON c.Projnum = p.Projnum
WHERE p.ShipDate IS NULL
AND NOT EXISTS(SELECT NULL FROM tags t WHERE t.Jobnum = c.Jobnum)