我很难在这里查看看似相对简单的查询。
基本上我为我的用户提供了一份合同表。每个用户都有多个合同。当合同到期时,它不会被标记为这样,如果用户与我们续订,则会创建一个新的活动合同记录,并在未来创建一个新的结束日期,我们将继续这样做。
我想要做的是创建一个查询,选择所有合同已过期但未与我们续订的用户。
为简单起见,这里是我的合同表的简单版本。
+------+----------+--------+
|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,因为他尚未续订。
答案 0 :(得分:4)
SELECT UserId
FROM Contract
GROUP BY UserId
HAVING MAX(EndDate) < GETDATE()
答案 1 :(得分:3)
您可以在NOT EXISTS
子句中使用Where
来查看用户是否没有结束日期大于现在的合同。
SELECT
*
FROM Contract c
WHERE EndDate < GetDate()
AND NOT EXISTS
(
SELECT
1
FROM Contract ic
WHERE ic.UserID = c.UserID
AND ic.EndDate > GetDate()
)