2011-11-02 1 views
0

나는 통합 프로젝트에서 일하고 있으며 어떤 조합을 이미 저장했는지 저장 한 다음 해당 batchlog 테이블에 대해 새 데이터를 확인하는 배치 로그 테이블을 만들었습니다. 나는 대부분 그냥이 같은의는 고객 ID 가정 해 봅시다, batchlog 테이블에 하나 개의 ID를 저장 한 후 고객 테이블에서 새 행을 선택한 것처럼 긴으로 꽤 잘 작동 :SQL에서 조건의 조합으로 설정하는 방법은 무엇입니까?

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

그러나, 지금이 솔루션은 더 복잡하고 같은 행은 고객 테이블에서 다른 데이터와 조합하여 여러 번 내보낼 수 있도록 지금 별도의 저장 프로 시저 및 IntegrationBatchlog 테이블 (CusID, OrdertypeID 및 PaymentMethod)에 더 많은 열을 몇 개 가지고 있으므로 내 선택 항목에 조인하므로 더 좋아합니다. 그래서 여기

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 테이블에서 같은 행에 있습니까?

답변

0

한 가지 방법은 IntegrationBatchLog 테이블에 LEFT JOIN을 만 존재하지 않는 행을 삽입하는 표준 SQL이다

일치하는 여러 열 수 있습니다.

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

IN이 아니라 EXISTS을 사용하십시오. 이것은이

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) 
0
SELECT ... 
FROM Customer c JOIN ... 
WHERE NOT EXISTS (SELECT * 
        FROM IntegrationBatchLog I 
        WHERE I.CusID = c.CusId AND 
         I.OrderTypeId = c.OrderTypeID ...) 
0

아마 여기서 일 것이다 존재한다. 다음은 MySQL의 문서에서 예 (나는 당신의 DB를 모르는)의 - 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 
) 
관련 문제