У меня есть 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, тогда как, если я вынимаю или НЕ СУЩЕСТВУЮ часть, она работает правильно.
Какие-либо идеи относительно того, что я делаю неправильно или как сделать то, что я желаю сделать?
Что касается исходного запроса, попробуйте
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.
Похоже, вам вместо этого нужны левые соединения. Возможно, я немного ошибаюсь в своем синтаксисе 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