給定表:
| 姓名 | 日期 | 最后日期 | 頻率 |
|---|---|---|---|
| 人1 | 2022 年 1 月 1 日 | 2022 年 5 月 2 日 | 30天 |
預期輸出:
| 姓名 | 更新日期 | 其他一些列 |
|---|---|---|
| 人1 | 2022 年 1 月 1 日 | 值 1 |
| 人1 | 2022 年 1 月 31 日 | 價值 2 |
| 人1 | 2022 年 3 月 2 日 | 價值 3 |
| 人1 | 2022 年 4 月 1 日 | 價值 4 |
| 人1 | 2022 年 5 月 1 日 | 價值 5 |
如上所示,我們已經給了一條記錄,要求是從這條記錄中創建一個新表。我們必須繼續插入新行,直到預期表中的“更新日期”(上一行日期 頻率天數)小于給定表中的“最后日期”。
我想了解 Oracle SQL 是否有辦法實作這一點。(沒有 PL/SQL)。
uj5u.com熱心網友回復:
我們可以在 INSERT SELECT 中使用遞回 CTE 來生成日期。
我已經使用過where name = 'Person1',但這可以根據需要洗掉或修改。如果 table1 中的記錄存在于 table2 中,它應該被更新、復制還是什么都沒有改變?
我冒昧地int為天數設定了頻率欄位型別。我們可以將其更改為能夠以天、周、月等方式對頻率進行編程,但 CTE 的增量會變得更加復雜。
底部有一個 dbFiddle 鏈接。
create Table table1( Name varchar(25), FirstDate Date, LastDate Date, Frequency int);
insert into table1 values ('Person1','1-Jan-2022','2-May-2022',30);
create table table2 ( Name varchar(25), UpdatedDate date, SomeColumn varchar(25));
INSERT INTO table2 WITH CTE (Name, Date_, LD ) AS (SELECT Name, FirstDate AS Date_ , LastDate FROM table1 WHERE Name = 'Person1' UNION ALL SELECT Name, Date_ 30, LD FROM CTE WHERE Date_ <= LD) SELECT Name, Date_, null FROM CTE;
SELECT * FROM table2;姓名 | 更新日期 | 一些專欄 :-------- | :------------ | :--------- Person1 | 01-JAN-22 | null Person1 | 31-JAN-22 | null Person1 | 02-MAR-22 | null Person1 | 01-APR-22 | null Person1 | 01-MAY-22 | null Person1 | 31-MAY-22 | null
db<>fiddle here
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/447522.html
上一篇:如何從Postgresql中的單獨日期和時間列創建時間戳?
下一篇:如何在mysql中跳過幾天?
