2013-10-23 3 views
0

SQL 문제가 있습니다. 중복 기록이 나옵니다. 날짜가 다르기 때문에 여러 레코드를 얻고 있습니다. 여기에 데이터의 예입니다 : 내가 날짜와 일치하는 레코드가없는 경우 널 기록을 보여 드리고자합니다SQL을 최신 레코드로 가져 오기

SELECT a.RacLetterId, a.AppealsLevelId, b.AppealLevelId, a.Level, a.DateSent, a.DeliveryService, b.AppealOutcomeId, b.AppealOutcomeDate 
FROM dbo.tbl_Tab_AppealsLevel a 
INNER JOIN (
    SELECT AppealLevelId, AppealOutcomeId,AppealOutcomeDate 
    FROM dbo.tbl_Tab_AppealCode 
    WHERE AppealLevel = 1 
    ) b 
ON (AppealLevelId = a.AppealsLevelId) 
WHERE Level = 1 

:

Sample SQL Data

가 여기 내 SQL입니다. 그 외에는 가장 최근의 AppealOutcomeDate을 보여 드리고자합니다.

답변

0

날짜가있는 일치하는 레코드가없는 경우 null 레코드를 표시하고 싶습니다.

는 NULL 값을 포함 할 경우, 당신은 아마 왼쪽 외부 (또는 "LEFT 가입") 가입이 필요합니다 조인에 대해

SELECT a.RacLetterId, a.AppealsLevelId, b.AppealLevelId, a.Level, a.DateSent, a.DeliveryService, b.AppealOutcomeId, b.AppealOutcomeDate 
FROM dbo.tbl_Tab_AppealsLevel a 
LEFT JOIN 
(
    SELECT AppealLevelId, AppealOutcomeId,AppealOutcomeDate 
    FROM dbo.tbl_Tab_AppealCode 
    WHERE AppealLevel = 1 
) b 
ON (AppealLevelId = a.AppealsLevelId) 
WHERE Level = 1 

자세한 내용은 제프 Atwoord의 CODING HORROR: A Visual Explanation of SQL Joins

추천

가장 최근의 AppealOutcomeDate를 표시하고 싶습니다. 날짜가 중복의 변화 값으로 만 열 경우

, 당신은 다른 모든 컬럼에 대한 간단한 GROUP BY를 사용하고 다른 열 만약 MAX(AppealOutcomeDate)

SELECT a.RacLetterId, a.AppealsLevelId, b.AppealLevelId, a.Level, a.DateSent, a.DeliveryService, b.AppealOutcomeId, MAX(b.AppealOutcomeDate) 
FROM dbo.tbl_Tab_AppealsLevel a 
LEFT JOIN 
(
    SELECT AppealLevelId, AppealOutcomeId,AppealOutcomeDate 
    FROM dbo.tbl_Tab_AppealCode 
    WHERE AppealLevel = 1 
) b 
ON (AppealLevelId = a.AppealsLevelId) 
WHERE Level = 1 
GROUP BY a.RacLetterId, a.AppealsLevelId, b.AppealLevelId, a.Level, a.DateSent, a.DeliveryService, b.AppealOutcomeId 

를 선택할 수 있습니다 '값이 (변화하는 날짜와 관련하여) 변화, 그리고이 (가) 중복 데이터의 원인이되는 결합이다, 당신은 ON 절 당신의 가입의에 하위 쿼리를 추가 할 수 있습니다

SELECT a.RacLetterId, a.AppealsLevelId, b.AppealLevelId, a.Level, a.DateSent, a.DeliveryService, b.AppealOutcomeId, b.AppealOutcomeDate 
FROM dbo.tbl_Tab_AppealsLevel a 
LEFT JOIN 
(
    SELECT AppealLevelId, AppealOutcomeId,AppealOutcomeDate 
    FROM dbo.tbl_Tab_AppealCode 
    WHERE AppealLevel = 1 
) b 
ON AppealLevelId = a.AppealsLevelId 
AND AppealOutcomeDate = 
    (
     SELECT MAX(AppealOutcomeDate) 
     FROM dbo.tbl_Tab_AppealCode 
     WHERE AppealLevel = 1 
      AND AppealLevelId = a.AppealsLevelId 
    ) 
WHERE Level = 1 
+0

두 번째 예는 내가 필요에 너무 가깝습니다. 유일한 다른 문제는 중복 레코드를 보여줍니다. 'DISTINCT'키워드를 사용하여 문제가 해결되었습니다! 이것은 그것을했다! JDB에 감사드립니다! –

+0

@TravisGrannan - 내가 말했듯이, 두 번째 예제는 중복 데이터를 생성하는 조인 인 경우에만 작동합니다. 주 테이블에 중복 데이터가있는 것 같습니다 (조인 이전). – JDB

+0

@JBD - 전혀 짜증나지 않고 서비스를 갚았습니다. – Hogan

0

을 왼쪽 JO를 사용하여 대신에 당신은 널 (null) 행을 포함 할 수 있습니다, 당신은하지 최대 - 날짜 기록을 제외하고 모두 제거하기 위해 절을 EXISTS 사용할 수 있도록 :

SELECT a.RacLetterId, a.AppealsLevelId, b.AppealLevelId, a.Level, a.DateSent, 
    a.DeliveryService, b.AppealOutcomeId, b.AppealOutcomeDate 
FROM dbo.tbl_Tab_AppealsLevel a 
LEFT OUTER JOIN dbo.tbl_Tab_AppealCode b ON a.AppealsLevelId = b.AppealLevelId 
    AND b.AppealLevel = 1 
WHERE a.Level = 1 
AND NOT EXISTS 
(
    SELECT 1 
    FROM dbo.tbl_Tab_AppealCode bb 
    WHERE bb.AppealLevelId = b.AppealLevelId 
    AND bb.AppealLevel = 1 
    AND bb.AppealOutcomeDate > b.AppealOutcomeDate 
) 
관련 문제