2010-03-17 8 views
2

두 테이블이 있는데, 하나는 포럼 스레드 테이블입니다. 마지막 게시 날짜 열이 있습니다.두 테이블에 대한 SQL 조인 도움말

다른 테이블에는 PostID, UserId 및 DateViewed가 있습니다.

현재 사용자의 DateViewed와 LastPostDate를 비교할 수 있도록이 테이블에 가입하려고합니다. 그러나 스레드를 본 적이없는 경우 두 번째 테이블에 행이 없습니다.

이것은 쉬운 것처럼 보이지만 주위에 내 머리를 감쌀 수 없습니다. 제발 조언 해줘.

미리 감사드립니다. 보기에는 해당 행이 존재하지 않는 경우는 v.DateViewed이 NULL이됩니다

SELECT t.UserID, t.PostID, t.LastPostDate, v.DateViewed 
FROM dbo.Threads t 
LEFT JOIN dbo.Views v ON v.PostID = t.PostID 
        AND v.UserID = t.UserID 
WHERE t.UserID = @user; 

:

+0

왼쪽 연결을 시도합니다. 왼쪽 외부를 사용했습니다. – bladefist

+0

'OUTER'이 중복되었습니다. LEFT JOIN과 똑같은 것입니다. – Aaronaught

+0

동일합니다. –

답변

2

당신이 구체적으로 어떻게하려고하는 그 무엇입니까? 당신은 단지 외부를 사용할 필요가

가입 : 나는 JOIN 상태에서 UserID 테스트를 배치 한

SELECT p.PostID, p.LastPostDate, ..., 
    CASE 
     WHEN v.DateViewed IS NULL OR v.DateViewed < p.LastPostDate THEN 1 
     ELSE 0 
    END AS Unread 
FROM Posts p 
LEFT JOIN PostViews v 
    ON v.PostID = p.PostID 
    AND v.UserID = @UserID 

참고; WHERE 술어에 넣으면 PostViews 테이블에 일치하는 행이 없으므로 결과가 표시되지 않습니다.

+0

이것은 완벽한 감사를 받았습니다. – bladefist

+0

좋아요, 좋은 ... 스레드와 게시물 사이에 어떤 연결도 찾을 수 없기 때문에 질문을 다시 읽고 혼란 스러웠습니다. 너는 그것을 알아 냈다! – Aaronaught

1

그래서 당신은 같은 것을 생각하고있다. 당신이보기에 행이 많이있는 경우

, 당신이 그런 짓을하는 것이 좋습니다 :

SELECT t.UserID, t.PostID, t.LastPostDate, v.DateViewed 
FROM dbo.Threads t 
CROSS APPLY (SELECT MAX(vw.DateViewed) as DateViewed 
      FROM dbo.Views vw 
      WHERE vw.PostID = t.PostID 
       AND vw.UserID = t.UserID 
      ) v 
WHERE t.UserID = @user; 
+0

테이블에 사용자 ID가 없습니다. UserId는 스레드를 마지막으로 본 테이블을 보유하고 있습니다. 실행시의 위치에 적용됩니다 – bladefist

0

열쇠는 올 오른쪽에 존재하지 않는 행을 일으킬 것이다하는 LEFT JOIN을 사용하는 것입니다 NULL 모든으로 : - 읽지 않은 게시물이 있는지 확인

SELECT threads.lastpostdate, posts.dateviewed 
FROM threads 
LEFT JOIN posts 
    ON threads.id=posts.postid