Нет в запросе доступа - PullRequest
       27

Нет в запросе доступа

1 голос
/ 08 сентября 2011

У меня две таблицы ниже

tblLoc (LocCode) tblData (Item, LocCode)

В tblData есть дополнительный LocCode, который не находит в tblLoc.

SELECT D.LocCode
FROM tblData AS D
WHERE D.LocCode NOT IN (SELECT LocCode FROM tblLoc);

Я использую этот запрос.Это медленно.Есть ли лучший запрос?

Ответы [ 2 ]

4 голосов
/ 08 сентября 2011

Используйте левое соединение на LocCode между tblData и tblLoc. Ограничьте результирующий набор только теми строками, где tblLoc LocCode имеет значение Null. Добавьте индекс на LocCode для tblLoc, если у вас его еще нет.

SELECT d.LocCode
FROM
    tblData AS d
    LEFT JOIN tblLoc AS l
    ON d.LocCode = l.LocCode
WHERE l.LocCode Is Null;
2 голосов
/ 12 сентября 2011

Реляционный оператор, на который вы ссылаетесь, известен как полуразница или анти-соединение.Существует множество способов написания анти-объединений в Access (ACE, Jet и т. Д.): Помимо вашей и @ HansUp, есть еще пара:

SELECT D.LocCode
  FROM tblData AS D
 WHERE D.LocCode <> ALL (SELECT LocCode FROM tblLoc);

 SELECT D.LocCode
  FROM tblData AS D
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM tblLoc
                    WHERE D.LocCode = L.LocCode
                  );

Я думаю, что последняя лучше, потому чтопараметры для прецизионного кода в коде приблизительны, и поэтому мне, человеку, легче читать и понимать.

HansUp считает, что они лучше, потому что должен быть быстрее вашего (но онивероятно, присоединюсь ко мне и призываю вас всегда тестировать, используя данные, типичные для вашего варианта использования).

Как вы определяете «лучше»?

...