2011-04-25 2 views
0

다음과 같은 문제를 다루기 위해 SQL 문을 알고 싶습니다. 여기에 몇 가지 문제가 있습니다.SQL 문 작성 방법은 무엇입니까?

SupplierID ContractStart ContractEnd   

20   1/1/2010  1/3/2010 
24   12/12/2008  12/1/2009 
31   13/1/2008  13/2/2008 
20   13/1/2008  13/2/2008 
24   11/11/2007  11/12/2010 
31   12/12/2008  1/1/2009 

이 테이블에서 계약을 중복 공급 업체 ID를 확인하시기 바랍니다. 테이블이 t 경우

답변

1

이 그것을 수행해야합니다

select a.supplierid, b.supplierid 
from t a, t b 
where ((b.contractstart<a.contractend and b.contractend>a.contractend) 
    or (a.contractstart<b.contractstart and a.contractend>b.contractstart)) 
    and a.supplierid<b.supplierid -- strict so you don't get doubles 

편집 : 이것은 중복 된 아이디의 오타입니다 가정합니다. 당신은 공급 업체 ID로 중복을 식별하기 위해 찾고 있다면

0
SELECT a.sid 
FROM contracts a, contracts b 
WHERE a.sid == b.sid 
AND a.start < b.start 
AND a.end > b.start; 
0

이 작동합니다 :

는 참고로 나는 (mm/dd/yyyy)을 사용

declare @contract table (SupplierID int, ContractStart datetime, ContractEnd datetime) 

insert into @contract 
select 20, '1/1/2010', '3/1/2010' 
union all 
select 24 , '12/12/2008', '1/12/2009' 
union all 
select 31, '1/13/2008 ', '2/13/2008' 
union all 
select 20, '1/13/2008', '2/13/2008' 
union all 
select 24, '11/11/2007 ', '12/11/2010' 
union all 
select 31, '12/12/2008 ', '1/1/2009' 

SELECT a.supplierid, 
     a.contractstart, 
     a.contractend, 
     b.contractstart, 
     b.contractend 
FROM @Contract a 
     INNER JOIN @Contract b 
     ON b.supplierid = a.supplierid 
WHERE (b.contractstart < a.contractend) 
     AND (b.contractend > a.contractstart) 
     AND (b.contractstart != a.contractstart --Ignore overlap with self 
      AND b.contractend != a.contractend) 
     AND b.contractstart > a.contractstart -- No Duplicates