Как я правильно использую два оператора Not Exists в где пункт с помощью Доступа SQL VBA?

У меня есть 3 Таблицы: NotHeard, проанализированный, analyzed2. В каждой из этих таблиц у меня есть два столбца под названием UnitID и Адрес.

Что я пытаюсь сделать, прямо сейчас должен выбрать все записи для столбцов UnitID и Address from NotHeard, которые не появляются или в проанализированном или в analyzed2. SQL-оператор, который я создал, был следующие:

SELECT UnitID, Address  
INTO [NotHeardByEither] 
FROM [NotHeard] 
Where NOT EXISTS( Select analyzed.UnitID FROM analyzed WHERE [NotHeard].UnitID = analyzed.UnitID) 
or NOT EXISTS( Select analyzed2.UnitID FROM analyzed2 WHERE [NotHeard].UnitID = analyzed2.UnitID) 
Group BY UnitID, Address 

Я думал, что это будет работать, так как я использовал сингл НЕ, СУЩЕСТВУЕТ строка подзапроса, и это работало просто великолепно для меня в прошлом. Вышеупомянутый запрос однако возвращает те же данные, которые находятся в таблице NotHeard, тогда как, если я вынимаю или НЕ СУЩЕСТВУЮ часть, она работает правильно.

Какие-либо идеи относительно того, что я делаю неправильно или как сделать то, что я желаю сделать?

5
задан Bryan 1 April 2010 в 21:04
поделиться

2 ответа

Что касается исходного запроса, попробуйте

NOT (
   EXISTS( 
    Select analyzed.UnitID FROM analyzed WHERE [NotHeard].UnitID = analyzed.UnitID) 
AND EXISTS( 
    Select analyzed2.UnitID FROM analyzed2 WHERE [NotHeard].UnitID = analyzed2.UnitID) 
    )

, что будет означать, что ни в одном из них нет. Но это то же самое, что у вас было изначально (проверено на выборочных данных). Вы уверены, что не имеете в виду ни в А, ни в Б? Это было бы

NOT (
   EXISTS( 
    Select analyzed.UnitID FROM analyzed WHERE [NotHeard].UnitID = analyzed.UnitID) 
OR EXISTS( 
    Select analyzed2.UnitID FROM analyzed2 WHERE [NotHeard].UnitID = analyzed2.UnitID) 
    )

. Поймите, что решение EXISTS использует коррелированные подзапросы, которые могут работать хуже, чем LEFT JOIN и NULL, вот пример.

SELECT NotHeard.UnitID, NotHeard.Address
FROM (NotHeard LEFT JOIN analyzed ON NotHeard.UnitID = analyzed.UnitID) 
     LEFT JOIN analyzed2 ON NotHeard.UnitID = analyzed2.UnitID
WHERE analyzed.UnitID Is Null OR analyzed2.UnitID Is Null
GROUP BY NotHeard.UnitID, NotHeard.Address;

Обратите внимание, что я использовал ИЛИ в условии по сравнению с решением Остина, И не дал бы вам ни в проанализированном, ни в проанализированном2.

7
ответ дан 14 December 2019 в 08:46
поделиться

Похоже, вам вместо этого нужны левые соединения. Возможно, я немного ошибаюсь в своем синтаксисе Access.

SELECT UnitID, Address  
INTO [NotHeardByEither] 
FROM [NotHeard] 
    LEFT JOIN [analyzed] ON [NotHeard].UnitID = [analyzed].UnitID
    LEFT JOIN [analyzed2] ON [NotHeard].UnitID = [analyzed2].UnitID
WHERE IsNull([analyzed].UnitID)
    AND IsNull([analyzed2].UnitID)
Group BY UnitID, Address 
0
ответ дан 14 December 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: