如何将一组组合作为SQL中的条件?

如何将一组组合作为SQL中的条件?,sql,join,where,Sql,Join,Where,我正在从事一个集成项目,并创建了一个batchlog表,在其中存储已导出的组合,然后根据该batchlog表检查新数据。只要我在batchlog表中只存储了一个ID,比如说Customer ID,然后从Customer表中选择新行,它就工作得很好,如下所示: SELECT * FROM Customer WHERE CusId NOT IN (SELECT CusID FROM IntegrationBatchlog) 但是,现在解决方案更复杂,客户表中的同一行将与其他数据一起导出多次,所

我正在从事一个集成项目,并创建了一个batchlog表,在其中存储已导出的组合,然后根据该batchlog表检查新数据。只要我在batchlog表中只存储了一个ID,比如说Customer ID,然后从Customer表中选择新行,它就工作得很好,如下所示:

SELECT * 
FROM Customer 
WHERE CusId NOT IN (SELECT CusID FROM IntegrationBatchlog)
但是,现在解决方案更复杂,客户表中的同一行将与其他数据一起导出多次,所以现在我在IntegrationBatchlog表CusID、OrdertypeID和PaymentMethod中有两个单独的存储过程和更多的列,在我的select中有join子句,所以现在更像是这样

SELECT * FROM Customer c
JOIN....
JOIN...
JOIN...
WHERE there is not a row with that CusID AND OrderTypeID AND PaymentMethod in batchlog table yet.
所以在这里,我应该检查是否已经导出了这个精确的组合,但是当您在batchlog表中有三个或多个ID列,并且希望排除所有三个ID已经存在于batchlog表的同一行中的行时,如何进行导出?

使用存在,而不是在中。这允许多列匹配

这是标准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)
一种方法是对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

也许不存在会在这里起作用。下面是MySQL文档中的一个示例,我不知道您的数据库-

第二个例子:

在任何城市都有什么样的商店

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
)
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
)