日期:2014-05-16  浏览次数:20886 次

求高级SQL 一个 ,高手进
有表如下table1

  name date mark;

  0011 2011-1-17 ss
  0011 2011-1-24 sss
  0022 2011-1-31 ddd


其中date 字段全是周一;

 我的需求是 找出一段时间之内表中没有记录的数据;

比如下面的SQL就是时间段2011-01-01到2011-02-07之间的所有周一的数据。

select next_day(to_date('2011-01-03','yyyy-mm-dd')+(level-1)*7,2) monday
from dual
connect by next_day(to_date('2011-01-03','yyyy-mm-dd')+(level-1)*7,2) <= to_date('2011-02-07','yyyy-mm-dd')

  上面SQL结果为 
  2011-1-10
  2011-1-17
  2011-1-24
  2011-1-31
  2011-2-7
那么name 为0011的人会有 三条数据 ,日期为2011-1-10,2011-1-31,2011-2-7,就是日期在table1中没有的数据,
name为0022的人有两条四条数据;
这个SQL怎么写啊?


------解决方案--------------------
SQL code
with temp as(
select '0011' name,to_date('2011-01-17','yyyy-mm-dd') "date",'ss' mark from dual
union all
select '0011' name,to_date('2011-1-24','yyyy-mm-dd') "date",'sss' mark from dual
union all
select '0022' name,to_date('2011-1-31','yyyy-mm-dd') "date",'ddd' mark from dual
),x as(
select level lv from dual connect by level < 100
)

select name,date1,dates from(
select name,"date" + lv -1 date1,to_char("date" + lv-1,'DAY') dates from temp,x order by name
)where trim(dates)='MONDAY' and name='0022' and date1 >=to_date('2011-01-01','yyyy-mm-dd')
and date1 <=to_date('2011-02-07','yyyy-mm-dd') order by name,dates