次のように、再帰クエリを使用して「期間」数を計算できます。
あなたの質問の下のコメントで表現されているように、私はあなたが「週」列で何を意味するのか完全には理解していません(そしてあなたの定義が実際に矛盾している可能性があると思います-明確にするためにあなたに任せます)。
with
r (plan, period, max_periods, start_date) as (
select plan, 1, max_periods, start_date
from table_1
union all
select plan, period + 1, max_periods,
least(start_date + 7, add_months(trunc(start_date, 'mm'), 1))
from r
where period < max_periods
)
select plan, period, start_date
from r
;
PLAN PERIOD START_DATE
---- ---------- ----------
A 1 2020-05-01
A 2 2020-05-08
A 3 2020-05-15
A 4 2020-05-22
A 5 2020-05-29
A 6 2020-06-01
A 7 2020-06-08
A 8 2020-06-15
A 9 2020-06-22
A 10 2020-06-29
A 11 2020-07-01
A 12 2020-07-08
これはTABLE_1の最大期間に基づいており、私はTABLE_2をまったく使用していません。 TABLE_1のみからこの結果セットを生成した後、2つのテーブルを結合するか、必要に応じてアプローチを適応させることができます。