SQL2000下,假设有这么两张表  
表1存储用户的基本信息
"userid" (主键)
"用户姓名"
.
.
.
表2:存储所用用户的购买信息
"userid"
"时间"
我现在是想查询30天未购买东西的用户,下面这段是我昨天问到的答案,当时我觉得正确的! 最后发现这段代码内层查询到的userid是所有购买时间记录大于30天的userid.估计是我昨天表述不清楚!SELECT * 
FROM USERINFO 
WHERE userid IN  
             (SELECT userid
               FROM BuyInformation
               WHERE  DATEDIFF(day, 时间, GETDATE()) > 30
              )

解决方案 »

  1.   

    select * from USERINFO a
     where not exists(select 1 from BuyInformation 
            where userid=a.userid and DATEDIFF(day, 时间, GETDATE()) > 30)
      

  2.   


    试了下,这个貌似不能得到我想要的结果!
    比如我有如下几条记录,我用上面这张方法查询20天未购买东西的用户,查询出来的结果是20天内购买过东西的用户,如果我把NOT EXISTS换成EXISTS,又会多余查询出0003号用户.
    0001 2012-10-15
    0002 2012-10-1
    0003 2012-9-1
    0004 2012-9-15
    0005 2012-10-10
    0003 2012-10-1
      

  3.   

    其实就相当于查询表2中所有用户最近一次的购买日期,然后再和当前时间进行比对,将日期大于30天的用户详细信息再通过表1查出来!
    思路应该是这样,我也试过用如下方法查出单个用户最近一次消费记录,然后进行比对,但这种方法只能判断一个用户的信息! SELECT top 1 时间 
    FROM BuyInformation
    where 用户编号  = '000100010001'
    ORDER BY 时间 DESC
      

  4.   

    改成小于号貌似正确了,请问能不能给我解释下下面这句语句中userid=a.userid是什么作用?
    where userid=a.userid and DATEDIFF(day, 时间, GETDATE()) > 30)
      

  5.   

    userid=a.userid 是为exists 用的吧! 懂了! 谢谢了!
      

  6.   


    --查小于30天所有购买者的ID
    ;with abc as (
    select userid from BuyInformation where DATEDIFF(day, 时间, GETDATE()) < 30
    )
    --查所有不包含上述ID的用户信息
    select * from userinfo where userid not in (select * from abc)
      

  7.   

    --查小于30天所有购买者的ID
    ;with abc as (
    select userid from BuyInformation where DATEDIFF(day, 时间, GETDATE()) < 30
    )
    --查所有不包含上述ID的用户信息
    select * from userinfo where userid not in (select * from abc)
    这样写到是清晰明了,为什么提示 "在关键字 'with' 附近有语法错误。"