1

我有这样的表:

CreateDate  |  UserID
2012-01-1   |     1
2012-01-10  |     2
2012-01-20  |     3
2012-02-2   |     4
2012-02-11  |     1
2012-02-22  |     2
2012-03-5   |     3
2012-03-13  |     4
2012-03-17  |     5

我需要查询来显示在 2013 年 2 月 1 日之后创建并且在 2013 年 2 月 1 日之前在数据库中不存在的 UserID

从上面的例子中,结果必须是:

CreateDate  |  UserID
2012-02-2   |     4
2012-03-13  |     4
2012-03-17  |     5

它只能在没有存储过程的单个查询中解决吗?

4

2 回答 2

1

您可以使用子查询单独获取UserID之前存在Feb. 2, 2013的子查询,然后使用LEFT JOIN.

SELECT  a.*
FROM    tableName a
        LEFT JOIN 
        (
            SELECT  UserID
            FROM    tableName
            WHERE   CreateDate < '2013-02-01'
        ) b ON a.userID = b.userID
WHERE   a.CreateDate > '2013-02-01' AND
        b.userID IS NULL

为了获得更快的性能,请添加一个INDEXon 列userID

于 2013-02-19T09:37:48.817 回答
0

这是一种方法:

select 
  CreateDate,
  UserID
from Users
where CreateDate >= '2012-02-01'
and UserId not in (
  select UserId
  from Users
  where CreateDate < '2012-02-01'
)

SqlFiddle 链接:http ://www.sqlfiddle.com/#!2/7efae/2

于 2013-02-19T09:34:35.040 回答