2013-10-23 42 views
0

我遇到SQL問題。我得到重複的記錄。由於日期不同,我也得到多個記錄。下面是數據的一個例子:將我的SQL降到最新記錄

Sample SQL Data

這裏是我的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 

我想顯示空記錄,如果沒有匹配的記錄了日期。除此之外,我想顯示最近的AppealOutcomeDate

回答

0

我想顯示空記錄,如果沒有與日期相匹配的記錄。

如果你想包括NULL值,那麼你可能需要一個LEFT OUTER JOIN(或只是 「LEFT JOIN」):

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 

如果其他支柱「值變化(相對於改變日期),以及它的加入,這是造成重複數據,那麼你可以一個子查詢添加到您的JOIN的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

@JDD - 我根本沒有煩惱,我正在償還這項服務。 – Hogan

0

使用LEFT JO IN,而不是所以你可以包含空行,你可以使用NOT 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 
)