2013-08-19 1 views
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)) 

Я написал запрос в форме. но вступил в бесконечный цикл. Несмотря на долгое ожидание, результат не возвращается. я не понимаю, где я ошибаюсь ... (Пожалуйста, обратите внимание, что дни месяца)Как я могу снять дни месяца в oracle

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 

Каковы результаты запроса, как я писал выше, следующий запрос возвращает ошибку, причины и следствия, но

+1

Не уверен, что вы закончите вопрос, который вы оставили, но трудно понять, что вы имеете в виду. Нет никаких циклов, так как это просто не возвращается после долгого времени или это выполняется внутри цикла PL/SQL? Вы начали упоминать об ошибке, но не отображали ее. Первый запрос кажется смущенным о том, является ли это для марта или сентября. И ваши идентификаторы выглядят так, как будто они должны быть числами, поэтому принудительное их чередование ('1316'') может немного замедлить работу, если таблицы большие, хотя у вас, похоже, нет данных для' 1316'. У вас есть план объяснений, чтобы увидеть, что происходит? –

+0

все дни моего намерения взять месяц и день месяца, если моя таблица (id, fname, фамилия, дата), но если вы не вернете их в null в результате выражения запроса или результата это то, что ошибка ввода бесконечный цикл – ant

+0

'21 AAAA BBBBB 01.08.2013 2 AAAA BBBBB 02.08.2013 23 AAAA BBBBB 03.08.2013 нуль нуль нуль 04.08.2013 55 AAAA BBBBB 05.08.2013 нуль нуль нуль 06.08. 2013 .... null null null null 27.08.2013 28 aaaa bbbbb 28.08.2013 null null null null 29.08.2013 60 aaaa bbbbb 30.08.2013 51 aaaa bbbbb 31.08.2013 ' – ant

ответ

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 

Конечно, я, может быть выход из того, что вы на самом деле делаете. Ваш исходный запрос не фильтрует даты вообще, поскольку между ними нет соединения, поэтому вы, вероятно, получаете много результатов назад - я думаю, что у него есть намного больше данных, чем вы ожидаете, и поэтому занимает гораздо больше времени для извлечения данных. Это не то же самое, что бесконечный цикл, но я не вижу, где вы действительно можете иметь цикл.

+0

Запрос бесконечного цикла, но попытался понять, почему мое свидетельство. Спасибо Вам большое – ant