Как иметь набор комбинаций в качестве условия в SQL? - PullRequest
0 голосов
/ 03 ноября 2011

Я работаю над интеграционным проектом и создал таблицу пакетных журналов, где я сохраняю, какие комбинации уже были экспортированы, а затем проверяю новые данные по этой таблице пакетных журналов.Это работало довольно хорошо, пока я в основном просто сохранял один идентификатор в таблице пакетного журнала, скажем, идентификатор клиента, а затем выбирал новые строки из таблицы клиентов следующим образом:

SELECT * 
FROM Customer 
WHERE CusId NOT IN (SELECT CusID FROM IntegrationBatchlog)

Однако теперь решение более сложное иодна и та же строка из таблицы Customer будет экспортироваться несколько раз в сочетании с другими данными, поэтому теперь у меня есть несколько отдельных хранимых процедур и больше столбцов в таблице IntegrationBatchlog (CusID, OrdertypeID и PaymentMethod) и предложения объединения в моем выборе, так что теперь это больше похоже на *.1004 *

SELECT * FROM Customer c
JOIN....
JOIN...
JOIN...
WHERE there is not a row with that CusID AND OrderTypeID AND PaymentMethod in batchlog table yet.

Итак, здесь я должен проверить, была ли эта точная комбинация уже экспортирована, но как это сделать, когда вам нужно три столбца идентификатора в таблице пакетных журналов и вы хотите исключить те строки, где всетри идентификатора уже присутствуют в одной строке в таблице пакетного журнала?

Ответы [ 4 ]

0 голосов
/ 03 ноября 2011

Может быть, NOT EXISTS будет работать здесь. Вот пример из документации MySQL (я не знаю вашу БД) - http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

Второй пример:

«Какой тип магазина присутствует ни в одном городе?»

SELECT DISTINCT store_type FROM stores
  WHERE NOT EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);

Может быть, ваш может быть:

SELECT * FROM Customer c
JOIN....
JOIN...
JOIN...
WHERE NOT EXISTS ( 
    SELECT * FROM batchlog WHERE 
        c.CusID = batchlog.CusID AND 
        c.OrderTypeID = batchlog.OrderTypeID AND 
        c.PaymentMethod = batchlog.PaymentMethod
)
0 голосов
/ 03 ноября 2011

Один из способов - сделать LEFT JOIN для таблицы IntegrationBatchLog и вставить только те строки, которых нет.

select *
from Customer c
LEFT OUTER JOIN IntegrationBatchLog i
  on c.CusId = i.CusId 
     and c.OrderTypeID = i.OrderTypeID 
     and c.PaymentMethod = i.PaymentMethod
where
  i.CusId is null
0 голосов
/ 03 ноября 2011
SELECT ...
FROM Customer c JOIN ...
WHERE NOT EXISTS (SELECT * 
                  FROM IntegrationBatchLog I 
                  WHERE I.CusID = c.CusId AND 
                        I.OrderTypeId = c.OrderTypeID ...)
0 голосов
/ 03 ноября 2011

Используйте EXISTS, а не IN. Это позволяет сопоставлять несколько столбцов

Это стандартный SQL

SELECT * FROM Customer c
JOIN....
JOIN...
JOIN...
WHERE NOT EXISTS (
       SELECT * FROM IntegrationBatchlog I 
                WHERE C.CusID = I.CusID
                             AND C.OrderTypeID = I.OrderTypeID
                             AND C.PaymentMethod = I.PaymentMethod)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...