A表(会员表)
 member_ID 会员卡号(主键)
B表(会员活动历史表)
 RECORD_ID 记录编号(主键)
 member_ID
 ACTIVITY_DATE 活动日期以上是A、B两表的主要字段,现要查询3年内没有活动的会员,时间起点从当前年月日向前退三年,这两张表都很大,哪位高手能帮我写一个效率高的sql语句

解决方案 »

  1.   

    SELECT  A.member_ID,B.RECORD_ID,B.ACTIVITY_DATE
    FROM B,A
    WHERE
    B.ACTIVITY_DATE <= add_months(sysdate,-3*12);
      

  2.   

    SELECT A.*
      FROM A, B
     WHERE A.MEMBER_ID = B.MEMBER_ID
       AND MONTHS_BETWEEN(SYSDATE, B.ACTIVITY_DATE) >= 36;
    看看这个怎么样.....
      

  3.   

    上面的是错误的。
    SELECT  A.member_ID,B.RECORD_ID,B.ACTIVITY_DATE
    FROM B,A
    WHERE
    A.member_ID=B.member_ID AND
    B.ACTIVITY_DATE <= add_months(sysdate,-3*12);
      

  4.   

    SELECT A.*
      FROM (SELECT B.MEMBER_ID
              FROM B
             WHERE B.ACTIVITY_DATE <= ADD_MONTHS(SYSDATE, -36)
             GROUP BY B.MEMBER_ID) BB
      LEFT JOIN A ON A.MEMBER_ID = BB.MEMBER_ID
      

  5.   

    1. 首先在B表上建立 ACTIVITY_DATE列的索引,由于两个ID都是主键,不用建立索引了。
    2. 然后用下面的语句来实现:
    SELECT a.member_id, b.record_id, b.activity_date
    FROM b, a
    WHERE a.member_id = b.member_id
    AND b.activity_date <= add_months(SYSDATE, -3 * 12);
    我想这样效率可能会高些。
      

  6.   

    select * from a
    where not exists(select 1
      from b
      where memberid=a.memberid
      and actvity_date>add_months(sysdate,-36))