2014-01-16 54 views
1

我很難在這裏看到一個相對簡單的查詢。只有在不存在更新的記錄時才選擇記錄

基本上我有一個合同表爲我的用戶。每個用戶有多個合同。當合同到期時,它不會被標記爲這樣,如果用戶與我們續約,將來會創建一個新的活動合約記錄並帶有新的結束日期,我們會按此結束。

我想要做的是創建一個查詢,選擇合同已過期但尚未與我們續約的所有用戶。

爲簡單起見,這裏是我的合同表的簡單版本。

+------+----------+--------+ 
|UserID|ContractID|End Date| 
+------+----------+--------+ 
|1  |1   |1/1/2014| 
+------+----------+--------+ 
|2  |2   |1/1/2015| 
+------+----------+--------+ 
|3  |3   |1/1/2014| 
+------+----------+--------+ 
|1  |4   |1/1/2015| 
+------+----------+--------+ 

所以你可以看到用戶1有一個有效和無效合同,用戶2只活躍,用戶3只無效。我需要查詢才能找到用戶3,因爲他還沒有續約。

回答

3

您可以在Where子句中使用NOT EXISTS來查看用戶是否沒有現在具有大於結束日期的合約。

SELECT 
    * 
FROM Contract c 
WHERE EndDate < GetDate() 
    AND NOT EXISTS 
    (
     SELECT 
      1 
     FROM Contract ic 
     WHERE ic.UserID = c.UserID 
      AND ic.EndDate > GetDate() 
    ) 
+0

我在這裏奉勸唯一的事情就是GETDATE()會爲每一行,這將放慢改革的步伐大大以至引起的副作用進行評估。最好將GetDate()的值存儲在一個變量中,並將EndDate與該變量進行比較。 –

+8

@BrianDriscoll - 奇怪的是,沒有。 GETDATE()被視爲[運行時常量函數](http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/04/23/conor-vs-runtime-constant-functions.aspx) 。它可能仍然更清楚,並且在使用適當的多個語句的情況下,將當前日期/時間緩存在變量中。 – HABO

+1

@HABO今天我學到了...... –

4
SELECT UserId 
FROM Contract 
GROUP BY UserId 
HAVING MAX(EndDate) < GETDATE() 
+0

+1。這個查詢很簡單,並完成工作! – Shiva