2013-10-15 3 views
1

전화가있는 임시 테이블을 로그 테이블과 대조해야합니다.존재하지 않을 수있는 정보가있는 절 절

임시 테이블

  • 전화 VARCHAR (20)

로그 테이블

  • 전화 VARCHAR (20)
  • [상태] VARCHAR (20)
  • CHANGEDATE 날짜 시간

로그 테이블 데이터는

  • 로그 테이블의 모든 전화는 항상
  • 을 "추가"상태가됩니다하지만 모든 전화는 또한 "의 상태가됩니다 제거 "

예 :

,
  • 전화 상태 CHANGEDATE

  • 3054444444 추가 2012년 10월 12일

  • 4445556666 추가 2012년 10월 12일
  • 3,054,444,444 제거 2012년 11월 12일

where 절은 섹션이 두 개이며 모두 true 여야합니다.

1 Temp.Phone 가입 할 때

  • @date 커 또는
  • 여기

  • log.Status = '추가'log.ChangeDate 같음 까다로운 부분 .... 알아낼 수없는 것

    2. 가입은 다음 사항을 확인해야합니다. 1,

    • @date는
    • log.Status = '삭제'
    • 로그 log.ChangeDate
    • 보다 작다.상태 = '제거'존재하지 않을 수도 있습니다, 그래서 그 다음의 진정한 존재하는지 확인해야하고, 존재하지 않는 경우, 다음 무시하거나 진정한를 생성 어떻게 든

    SQL 문

    SELECT * 
    FROM #temp t 
    JOIN log l 
    ON t.Phone = l.Phone 
    WHERE (l.ChangeDate < = @Date AND l.Status = 'Added')  
        AND 
         (l.ChangeDate > @Date AND l.Status = 'Removed') --may not exist, but ALSO has to be true 
    
  • +0

    두 번째 "and"를 "or"로 변경하면 Bob이 삼촌 일 수 있습니다. –

    +0

    나는 .... 둘 다 사실이되어야한다. –

    답변

    2

    이 시도 ...

    SELECT * 
    FROM #temp t 
    JOIN log l 
        ON t.Phone = l.Phone 
    WHERE (l.ChangeDate < = @Date AND l.Status = 'Added')  
        AND (
        (l.ChangeDate > @Date AND l.Status = 'Removed') 
        or not exists(
         select 'removed' 
         from log l2 
         where l2.phone = t.phone 
         and l2.ChangeDate > @Date AND l2.Status = 'Removed' 
        ) 
    ) 
    
    +0

    서브 쿼리에서'>'는'<존재하지 않는'>이기 때문에'<='로 바꿔야한다고 생각한다. – David

    +0

    @David : 음, 전화를 제거한 다음 날짜가 없습니다. –

    +0

    이것은 여전히 ​​l.ChangeDate 필드가 @Date 매개 변수보다 작고 크다는 개념을 기반으로합니다. 나에게 비린 해 보인다. –

    1

    당신은 로그 테이블에 2 시간을 가입 할 수 있습니다 또는 NOT EXISTS 절을 사용하지만 날짜 불평등을 확인해야합니다

    SELECT * 
    FROM #temp t 
        INNER JOIN log l 
        ON t.Phone = l.Phone 
        AND l.Status = 'Added' 
        AND l.ChangeDate <= @Date 
    WHERE NOT EXISTS (
        SELECT * 
        FROM Log 
        -- This makes sure that the phone wasn't removed in between the date it was 
        -- added and the date you are querying. 
        WHERE Log.ChangeDate > l.ChangeDate 
         AND Log.ChangeDate <= @Date 
         AND Log.Phone = t.Phone 
         AND Log.Status = 'Removed' 
    )