select l.id, l.surname, l.fname, LAST_DAY(ADD_MONTHS('02.03.2013', -2)) + level,
TO_CHAR(T.fdate,'DD.MM.YYYY') FDATE from pers_log t, pers_list l
where t.id=l.id and t.id='1316'
CONNECT BY NOCYCLE level <= LAST_DAY(ADD_MONTHS('02.09.2013', -1)) - LAST_DAY(ADD_MONTHS('02.09.2013', -2))
我在表单中写了一个查询。但进入了无限循环。尽管等待很长时间都没有返回结果。 我不明白我哪里错了...... (请注意,该月的日期)
21 aaaa bbbbb 01.08.2013 (note:pers_log fdate is not null)
2 aaaa bbbbb 02.08.2013 (note:pers_log fdate is not null)
23 aaaa bbbbb 03.08.2013 (note:pers_log fdate is not null)
null null null 04.08.2013
55 aaaa bbbbb 05.08.2013 (note:pers_log fdate is not null)
null null null 06.08.2013
....
null null null 27.08.2013
28 aaaa bbbbb 28.08.2013 (note:pers_log fdate is not null)
null null null 29.08.2013
60 aaaa bbbbb 30.08.2013 (note:pers_log fdate is not null)
51 aaaa bbbbb 31.08.2013 (note:pers_log fdate is not null)
毕竟以下不是问题,但是我找不到像上面的查询那样进入无限循环的原因。
select l.id, l.surname, l.fname
TO_CHAR(T.fdate,'DD.MM.YYYY') FDATE from pers_log t, pers_list l
and to_char(t.FDATE, 'YYYY')='2013' and to_char(t.FDATE, 'MM')='08' and t.id='1316'
order by FDATE asc
21 aaaa bbbbb 01.08.2013
2 aaaa bbbbb 02.08.2013
23 aaaa bbbbb 03.08.2013
55 aaaa bbbbb 05.08.2013
28 aaaa bbbbb 28.08.2013
60 aaaa bbbbb 30.08.2013
51 aaaa bbbbb 31.08.2013
我在上面写的查询结果是什么,以下查询返回错误,原因和结果,但
答案 0 :(得分:0)
我仍然觉得很难弄清楚你想要做什么,但我想你的意思是你要列出查询日期前一个月的所有日子,并显示匹配来自pers_log and
pers_list`的数据(如果存在),否则为null?
如果是这样,那就是你需要的东西:
select t.id, l.surname, l.fname, to_char(x.target_date, 'DD.MM.YYYY')
from (
select last_day(add_months(to_date('02.09.2013', 'DD.MM.YYYY'), -2))
+ level as target_date
from dual
connect by level <= last_day(add_months(to_date('02.09.2013', 'DD.MM.YYYY'), -1))
- last_day(add_months(to_date('02.09.2013', 'DD.MM.YYYY'), -2))
) x
left join pers_log t on t.fdate = x.target_date
and t.id=1316
left join pers_list l on l.id = t.id
order by x.target_date;
内部选择会生成上个月的所有日期,作为我无法想象地称为x
的内联视图。然后为了获得可能的匹配数据,我已经将外连接用于实际表,这意味着如果没有匹配则将显示空值。
如果fdate
有时间组件,那么您需要在连接条件中忽略它。你可以这样做:
on trunc(t.fdate) = x.target_date
或
on t.fdate >= x.target_date and t.fdate < x.target_date + 1
当然,我可能已经开始了解你的实际行动。你的原始查询根本没有过滤日期,因为它们之间没有连接,所以你可能会得到很多结果 - 我认为它只是获得了比你预期的更多的数据,因此需要更长的时间检索数据。这与无限循环不同,但我看不出你实际上有一个循环。