Несколько таблиц NOT EQUAL в запросе доступа

У меня есть две таблицы. ТРАНСПОРТНЫЕ СРЕДСТВА и СОБСТВЕННОСТЬ. Я пытаюсь сделать запрос, который даст мне список всех ТРАНСПОРТНЫХ СРЕДСТВ НЕ в таблице OWNERSHIP. Мне в основном нужен отчет о моем доступном инвентаре ТРАНСПОРТНЫХ СРЕДСТВ. Я попробовал этот запрос:

SELECT VEHICLE.*
FROM VEHICLE, OWNERSHIP
WHERE (VEHICLE.VEH_ID <> OWNERSHIP.VEH_ID);

Я получаю: введите здесь описание изображения

Когда я делаю равные, я получаю все транспортные средства, которые перечислены во владении, так что это работает. Но NOT Equal - нет. Любые идеи?


person Batman    schedule 25.11.2012    source источник


Ответы (2)


Пытаться

SELECT VEHICLE.*
FROM VEHICLE
WHERE NOT EXISTS
(SELECT NULL FROM OWNERSHIP WHERE VEHICLE.VEH_ID= OWNERSHIP.VEH_ID);
person a1ex07    schedule 25.11.2012
comment
Я пытаюсь научиться этому, поэтому дайте мне знать, если я объясню это неправильно, пожалуйста. Подзапрос находит, какие транспортные средства находятся как в ТРАНСПОРТНОМ СРЕДСТВЕ, так и в ВЛАДЕНИИ. Принимая во внимание, что Внешний запрос выбирает все те Транспортные средства, которые не были идентифицированы как находящиеся в ТРАНСПОРТНОМ СРЕДСТВЕ и ВЛАДЕНИИ. Это правильно? Будет ли это считаться коррелированным подзапросом? - person Batman; 25.11.2012
comment
@Batman: Да, это правильно - такой подзапрос можно считать коррелированным. Однако это не всегда означает низкую производительность, оптимизатор достаточно умен, чтобы не запускать его для каждой отдельной строки... Я не уверен на 100%, что MS=Access поддерживает left join, но приведенный выше запрос такой же, как SELECT v.* FROM vehicle v LEFT JOIN ownership o ON (o.veh_id = v.veh_id) WHERE o.veh_id IS NULL и должен генерировать один и тот же план выполнения. - person a1ex07; 25.11.2012

Подход NOT EXISTS может быть медленным, если ваши таблицы содержат много строк. Альтернативный подход, который может быть намного быстрее, заключается в использовании LEFT JOIN с предложением WHERE для возврата только строк, в которых правое поле соединения имеет значение Null.

SELECT VEHICLE.*
FROM
    VEHICLE AS v
    LEFT JOIN OWNERSHIP AS o
    ON v.VEH_ID = o.VEH_ID 
WHERE o.VEH_ID Is Null;

Вы можете использовать "Мастер поиска несовпадающих запросов" в Access, чтобы создать аналогичный запрос.

Если обе таблицы маленькие, вы, вероятно, не заметите разницы. Но должно быть легко проверить, заметна ли разница. И этот подход послужит вам лучше, если ваши таблицы со временем значительно вырастут.

person HansUp    schedule 25.11.2012