ГДЕ НЕ СУЩЕСТВУЕТ несколько условий - PullRequest
1 голос
/ 22 марта 2012

Как установить несколько условий AND?напр.

SELECT *
FROM CONFIRMED
WHERE NOT EXISTS 
( 
    SELECT * 
    FROM Import_Orders
    WHERE Import_Orders.Customer = CONFIRMED.Customer
        AND Import_Orders.Reference = CONFIRMED.Reference
        AND Import_Orders.[Index] = CONFIRMED.[Index]  
        AND Import_Orders.QuantityToDeliver = CONFIRMED.QuantityToDeliver  
        AND Import_Orders.DateToDeliver = CONFIRMED.DateToDeliver  

);

Я знаю, что это работает на моих таблицах с одним условием WHERE & AND, но не с несколькими.

Мне нужен результат двух таблиц, в которых вышеуказанные условия не совпадают.У меня нет идентичных ключей в двух таблицах.Теперь с этим кодом я получаю все результаты, которые находятся в таблице ПОДТВЕРЖДЕНО.

Ответы [ 3 ]

5 голосов
/ 22 марта 2012

Вот синтаксис для нескольких таблиц:

WHERE NOT EXISTS (...) AND NOT EXISTS (...) AND NOT EXISTS (...)

Однако, если база данных настолько велика, что вы заботитесь о производительности, вам понадобится гораздо менее очевидный синтаксис в следующих строках:

LEFT JOIN Some_Table t ON (t.xxx = Main_Table.xxx)
LEFT JOIN Another_Table t2 ON (t2.xxx = Main_Table.xxx)
LEFT JOIN Yet_Another_Table t3 ON (t3.xxx = Main_Table.xxx)
...
WHERE t.id IS NULL AND t2.id IS NULL AND t3.id IS NULL

Для одной таблицы и одного составного условия, как в примере SQL в вашем вопросе:

LEFT JOIN Some_Table t ON
        t.xxx = Main_Table.xxx
    AND t.yyy = Main_Table.yyy
    AND t.zzz = Main_Table.zzz
WHERE t.id IS NULL

Ожидается, что он вернет строки, которые существуют в Main_Table, но не имеют совпадающих строк вSome_Table, предполагая, что столбцы xxx и т. Д. Не могут быть обнуляемыми.

Если, например, xxx обнуляем, вот как вам нужно изменить запрос далее:

LEFT JOIN Some_Table t ON
        (t.xxx = Main_Table.xxx OR (t.xxx IS NULL AND Main_Table.xxx IS NULL))
    AND t.yyy = Main_Table.yyy
    AND t.zzz = Main_Table.zzz
WHERE t.id IS NULL
3 голосов
/ 22 марта 2012

Я предполагаю, что у вас есть идентификатор в Import_Orders, если не использовать любое имя поля, которое оказывается пустым в запросе.Вам лучше использовать имена полей, а не *.Я добавил пример для Import_Orders.

SELECT CONFIRMED.*, Import_Orders.ID, Import_Orders.Customer
FROM CONFIRMED 
LEFT JOIN Import_Orders
ON Import_Orders.Customer = CONFIRMED.Customer
AND Import_Orders.Reference = CONFIRMED.Reference
AND Import_Orders.[Index] = CONFIRMED.[Index]  
AND Import_Orders.QuantityToDeliver = CONFIRMED.QuantityToDeliver  
AND Import_Orders.DateToDeliver = CONFIRMED.DateToDeliver  
WHERE Import_Orders.ID Is Null

Дополнительная информация

Fundamental Microsoft Jet SQL for Access 2000
Intermediate Microsoft Jet SQL for Access 2000
Advanced Microsoft Jet SQL for Access 2000

0 голосов
/ 22 марта 2012

Вы можете просто заменить все "=" на "<>", и вы должны получить все результаты, которые не соответствуют по всем критериям.

SELECT *
FROM CONFIRMED
WHERE EXISTS 
( 
    SELECT * 
    FROM Import_Orders
    WHERE Import_Orders.Customer <> CONFIRMED.Customer
        AND Import_Orders.Reference <> CONFIRMED.Reference
        AND Import_Orders.[Index] <> CONFIRMED.[Index]  
        AND Import_Orders.QuantityToDeliver <> CONFIRMED.QuantityToDeliver  
        AND Import_Orders.DateToDeliver <> CONFIRMED.DateToDeliver  

);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...