0
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 

我上面写的查询的结果是什么,下面的查询返回错误,原因和结果,但是

4

1 回答 1

0

我仍然很难弄清楚你想要做什么,但我认为你的意思是你想列出查询日期前一个月的所有日子,并显示来自pers_log andpers_list` 的匹配数据(如果存在),并且否则为空?

如果是这样,这就是您需要的那种东西:

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

当然,我可能对你实际在做什么有出路。您的原始查询根本没有过滤日期,因为它们之间没有连接,因此您可能会得到很多结果 - 我认为它获得的数据比您预期的要多得多,因此需要更长的时间检索数据。这与无限循环不同,但我看不出你实际上可以在哪里进行循环。

于 2013-08-19T09:56:18.503 回答