2014-05-19 130 views
1
SELECT p.ID, Name 
    FROM Policies p 
     INNER JOIN ProgramYears py ON p.ProgramYearID = py.id 
     INNER JOIN (SELECT MemberID, max(EffectiveDate) AS EffectiveDate 
         FROM Policies 
        GROUP BY MemberID) TEMP 
       ON p.memberid = TEMP.MemberID 
       AND p.EffectiveDate = TEMP.effectivedate 
       AND p.memberid NOT IN (SELECT MemberID 
             FROM InvoiceDetail 
             WHERE ProgramYear = NAME) 
+1

它有什麼問題嗎? – Magnus

+0

它抽空時間.. 如果我執行該部分 SELECT p.ID,名稱 FROM政策p INNER JOIN ProgramYears PY ON p.ProgramYearID = py.id INNER JOIN( SELECT MEMBERID ,最大值(EFFECTIVEDATE) AS EffectiveDate FROM Policies GROUP BY MemberID )TEMP ON p.memberid = TEMP.MemberID AND p.EffectiveDate = TEMP.effectivedate 它需要毫秒。執行,但之後,如果我執行整個查詢需要9-10秒執行。 所以我想優化它。 – Brijesh

+0

您在指定的表格中有多少條記錄? –

回答

1

NOT EXISTS通常是NOT IN一個更好的替代品,但你的選擇在很大程度上取決於數據和表和索引的結構。

請嘗試下面的查詢,但將其執行計劃與當前查詢的執行計劃進行比較;一種情況適用的可能不適用於另一種情況。

SELECT p.ID, Name 
    FROM Policies p 
     INNER JOIN ProgramYears py ON p.ProgramYearID = py.id 
     INNER JOIN (SELECT MemberID, max(EffectiveDate) AS EffectiveDate 
         FROM Policies 
        GROUP BY MemberID) TEMP 
       ON p.memberid = TEMP.MemberID 
        AND p.EffectiveDate = TEMP.effectivedate 
    WHERE NOT EXISTS 
      (SELECT MemberID 
       FROM InvoiceDetail AS ID 
       WHERE ID.ProgramYear = NAME 
       AND p.MemberId = ID.MemberId) 
+0

謝謝先生。我的問題已解決。不存在已將執行時間從9秒減少到3-4秒。 – Brijesh

0

你可以試試:

SELECT a.ID, a.Name 
    FROM (SELECT p.ID, Name, 
       ROW_NUMBER()OVER(PARTITION BY p.memberid ORDER BY p.EffectiveDate DESC) AS rnk 
      FROM Policies p 
       INNER JOIN ProgramYears py ON p.ProgramYearID = py.id 
      WHERE NOT EXISTS (SELECT MemberID 
           FROM InvoiceDetail AS ID 
          WHERE ID.ProgramYear = NAME 
           AND p.MemberId = ID.MemberId) 
     ) a 
    WHERE a.rnk = 1 
相關問題