2011-10-15 2 views
1

두 개의 테이블이 있습니다. 이들은 사용자 ID와 함께 링크됩니다. 내가 원했던 것은 테이블 2에 링크 된 레코드가 있는지 확인하는 것입니다. 그리고 해당 테이블의 날짜 필드가 오래된 시간보다 오래된 경우 또는 두 번째 테이블에 연결된 레코드가없는 경우 확인하십시오.sql : table2의 일치하는 (또는 일치하는) 레코드를 기반으로 테이블 1의 레코드를 선택하려고합니다.

왼쪽 결합을 원했지만 날짜 필드를 무시합니다. 두 번째 테이블에 레코드가 없으면 두 번째 테이블을 무시하고 싶습니다. 하지만 두 번째 테이블에 일치하는 레코드가 있고 날짜가 내 범위를 벗어난 경우 해당 레코드를 선택하지 않아도됩니다. 내가 그 실행하고 기록 적은 후 14 일 년대 uevh 테이블이 있다면

SELECT FirstName, Email, u.userid FROM u 
LEFT JOIN uevh 
ON u.UserID = uevh.UserID AND uevh.LastEmailed < GETDATE()-14 
WHERE u.ConfirmedEmail = 0 

, 난 레코드가 반환 싶지 않는,하지만 상관없이 날짜의 기록을 반환합니다.

+0

진행의 작은 조각을 만든 - 전환은 표 1 표 2에 합류 것 때문에 주위 가입 - 지금 때 선택하면 레코드를 반환하지 않아야하지만 필드에 null 값이있는 레코드가 반환됩니다. – merk

+0

적어도 지금까지 작성한 SQL 쿼리를 제공하십시오. – DeCaf

+0

죄송합니다 - 나는 현재 사용하고있는 SQL 쿼리를 포함했습니다. – merk

답변

2
SELECT u.FirstName 
    , u.Email 
    , u.userid 
FROM u 
WHERE NOT EXISTS 
     (SELECT * 
      FROM uevh 
      WHERE u.UserID = uevh.UserID 
      AND NOT (uevh.LastEmailed < GETDATE()-14) 
     ) 
    AND u.ConfirmedEmail = 0 

나 :

SELECT u.FirstName 
    , u.Email 
    , u.userid 
FROM u 
WHERE (EXISTS 
     (SELECT * 
      FROM uevh 
      WHERE u.UserID = uevh.UserID 
      AND uevh.LastEmailed < GETDATE()-14 
     ) 
    OR NOT EXISTS 
     (SELECT * 
      FROM uevh 
      WHERE u.UserID = uevh.UserID 
     ) 
    ) 
    AND u.ConfirmedEmail = 0 

나 :

SELECT u.FirstName 
    , u.Email 
    , u.userid 
FROM u 
    LEFT JOIN uevh 
    ON u.UserID = uevh.UserID 
WHERE u.ConfirmedEmail = 0 
    AND (uevh.LastEmailed < GETDATE()-14 
    OR uehv.UserID IS NULL 
    ) 
+0

# 3은 제가 게시하려고했던 것입니다. –

+0

# 3은 제가 함께 간 것입니다. 답변을 해주시고 저에게 여러 가지 방법을 보여 주신 것에 대해 감사드립니다. – merk

+0

그들은 여러 가지 방법이 아니지만 약간 다른 결과를 산출합니다. 작은 데이터 세트로 시도해보십시오. 차이점을 확인하십시오. –

1

다음과 같이 시도해 볼 수 있습니다. 이것은 테스트되지 않았지만 작동해야합니다.

Declare @date datetime; 
Set @date='20110101'; 

Select * 
from tbl1 
Left outer join tbl2 on tbl1.Id =tbl2.Id 
    and @date > coalesce(tbl2.date,dateadd(day,1,@date)); 
관련 문제