Соединение двух таблиц с последующим извлечением несопоставленных записей из третьей таблицы

У меня 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)
Другие вопросы по тегам