2014-11-20 3 views
0

В Oracle У меня есть таблица с 5 полями:Oracle Sql "создать" записи, основанные на полях

ID

PublishDate

StartDate

EndDate

Значение

Идея здесь в том, что я хочу «сгенерировать» записи, которые являются betw een StartDate и EndDate с теми же значениями, что и ID, PublishDate, & Значение этих записей.

т.е. это

10, 11/20/2014, 1/1/2016, 3/1/2016, 10 

превращается в

10, 11/20/2014, 1/1/2016, 10 
10, 11/20/2014, 2/1/2016, 10 
10, 11/20/2014, 3/1/2016, 10 

Так что я сделал это в прок, где я обхвата над каждой записи и генерации отчетов, но если мне интересно там это SQL-способ сделать что-то вроде этого?

ответ

1

Вы можете использовать CONNECT BY предложения для иерархических запросов:

select * from (select 10 id, '11/20/2014' PublishDate, '1/1/2016' StartDate, '3/1/2016' EndDate, 10 value 
       from dual connect by level <= 10); 

CONNECT BY level <= N будет производить N копии каждой строки таблицы

В вашем случае:

SELECT ID, PublishDate, StartDate + lvl, VALUE 
FROM your_tab 
    JOIN (SELECT LEVEL - 1 lvl FROM dual 
      CONNECT BY LEVEL <= (SELECT round(MAX(trunc(EndDate) - trunc(StartDate))) FROM your_tab) 
     ) 
    ON trunc(EndDate) - trunc(StartDate) >= lvl 
+0

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

+0

@ user441521 Извините, я не смотрел на выход внимательно. Я обновил свой ответ. – Multisync

+0

Знаете ли вы, что это очень медленный процесс? Запрос еще не вернулся для меня в моей ситуации, когда я принимаю ваш второй пример для моей конкретной таблицы. Нет ошибки, просто никогда не заканчивается. – user441521