2015-11-25 49 views
0

我有2個表([WY WC 2016更改TEMP]和[WC_JURIS_CODES])。我試圖根據第一個表中的記錄查找第二個表中的記錄,但只有第二個表中記錄最新的EFF_TO日期的記錄,前提是該EFF_TO = NULL的WC_CODE沒有任何其他記錄。如何識別重複記錄,其中沒有任何記錄具有NULL的特定字段

我開始用這個SQL:

SELECT OLD.[WC_CODE] 
     ,OLD.[EFF_FROM] 
     ,OLD.[EFF_TO] 
FROM [WY WC 2016 Changes TEMP] NEW --The SOURCE TABLE 
INNER JOIN [WC_JURIS_CODES] OLD on NEW.[WC_CODE] = OLD.[WC_CODE] 
WHERE NEW.[Status] = 'N' and (OLD.[JURIS_CODE] = 'WY' and OLD.[EFF_TO] is not NULL) or (OLD.[JURIS_CODE] = 'WY' and OLD.[EFF_TO] is NULL) 
ORDER BY OLD.[WC_CODE], OLD.[EFF_FROM] 

這將返回:

WC_CODE EFF_FROM EFF_TO 
000010 04/01/2011 12/31/2011 
000010 01/01/2012 12/31/2012 
000010 01/01/2013 12/31/2013 
000010 01/01/2014 12/31/2014 
000010 01/01/2015 NULL 
000020 04/01/2011 12/31/2011 
000020 01/01/2012 12/31/2012 
000020 01/01/2013 12/31/2013 
000020 01/01/2014 12/31/2014 
000030 04/01/2011 12/31/2011 
000030 01/01/2012 12/31/2012 
000030 01/01/2013 12/31/2013 
000030 01/01/2014 12/31/2014 

我只希望看到這樣的結果:

WC_CODE EFF_FROM EFF_TO 
000020 01/01/2014 12/31/2014 
000030 01/01/2014 12/31/2014 

,因爲它沒有其他記錄WC_CODE ='000030'或'000020',其中EFF_TO爲空,並且它們具有最新(最近的)EFF_TO日期。

我試過獨特的,獨特的,但沒有一個工作。我相信我需要識別重複,然後作爲一個羣體審問他們。毫無頭緒!任何幫助,將不勝感激。

謝謝!

+0

請爲您的兩個表發佈CREATE TABLE語句。另外,這是哪個數據庫系統? (我不認識'''''''語法。) – Alex

+0

@Alex。沒有「CREATE TABLE」。這兩個表已經存在於我的數據庫中。我正在使用MS SQL Server 2014. –

+0

瞭解。但看到「CREATE TABLE」將幫助我們理解表格的結構,從而幫助您給出更好的答案。 – Alex

回答

0

如果方括號被刪除,此查詢將適用於mysql。您可能需要針對ms sql server進行調整。

  • 在內部查詢中,查找每個WC_CODE的最大EFF_FROM的行。
  • 在外部查詢中,篩選這些結果以刪除具有NULLEFF_TO值的行。

就像這個...

SELECT 
    CODES.[WC_CODE], CODES.[EFF_FROM], CODES.[EFF_TO] 
FROM [WC_JURIS_CODES] CODES 
INNER JOIN (

    -- build a derived/temporary table with the largest EFF_CODE for each WC_CODE 
    -- run this query separately and tweak until it produces the result you want 
    SELECT 
    OLD.[WC_CODE], MAX(OLD.[EFF_FROM]) AS MAX_EFF_FROM 
    FROM [WY WC 2016 Changes TEMP] NEW 
    INNER JOIN [WC_JURIS_CODES] OLD ON (NEW.[WC_CODE] = OLD.[WC_CODE]) 
    WHERE 
    -- adjust these as needed 
    NEW.[Status] = 'N' 
    AND OLD.[JURIS_CODE] = 'WY' 
    GROUP BY 
    OLD.[WC_CODE] 

-- join derived table to main table 
) MAX_EFF_FROM ON (CODES.[WC_CODE] = MAX_EFF_FROM.[WC_CODE] AND CODES.[EFF_FROM] = MAX_EFF_FROM.[MAX_EFF_FROM]) 
-- and remove the NULLs 
WHERE 
    CODES.[EFF_TO] IS NOT NULL 

限制/警告:

  • 內部查詢獲取最大EFF_FROM,因爲它看起來像該值永遠不能爲null。
    • 如果您需要獲取最大EFF_TONULLEFF_TO,你還需要確保可以有最多1 NULLEFF_TOWC_CODE
    • 如果這些記錄中的日期範圍可能重疊,則需要調整此方法。 (即:如果最大EFF_FROM並不總是對應最大EFF_TO
  • EFF_FROM應爲每WC_CODE一個獨特的價值。如果不是,結果將是不可預測的。 (如果可能,(WC_CODE, EFF_TO)上的唯一索引將是個不錯的主意。)
相關問題