假设我有一个名为"contracts"的表,它有一列"NumYears"。
例如。
SELECT
ClientId,
NumYears
FROM Contracts
ClientId NumYears
-------- -----------
123456789 5
987654321 3
我有另一个表"contract_reviews",它可以通过ClientId加入到合同中。
每年,用户都会被要求查看保存在文件中的信息,并在完成后将新行插入"contract_reviews">
SELECT
ClientId,
Reviewed,
YearFor,
OtherColumn
FROM Contract_Reviews
ClientId Reviewed YearFor OtherColumn
--------- ----------- ------- -----------
123456789 1 2018 '£100'
123456789 1 2019 '£100'
客户"123456789"可能在第二年,因此"contract_reviews"将只保存2条记录。到"数字年"结束时,我们预计会有5年。
基本上,我需要从"contract_reviews"中选择所有行,并为丢失的"contract_reviews"生成新的空行,直到"NumYears"计数
ClientId Reviewed YearFor OtherColumn
--------- ----------- ------- -----------
123456789 1 2018 '£100'
123456789 1 2019 '£100'
123456789 0 NULL NULL
123456789 0 NULL NULL
123456789 0 NULL NULL
这个问题在一个表中重复行(x(次数提供了一些帮助,但解决方案仍然在回避我
一个选项是使用递归查询:
with cte as (
select
c.clientId,
c.numYears - (
select count(*) from contract_reviews cr where cr.clientId = c.clientId
) numYears
from contracts c
union all
select clientId, numYears - 1 from cte where numYears > 1
)
insert into contract_reviews(clientId)
select clientId from cte
递归cte的锚点为每个客户计算评审表中"缺少"的行数,然后递归部分生成这些行。最后,外部查询执行插入操作。
DB Fiddle上的演示-一旦执行查询,评审表的内容为:
ClientId|已审核|年度针对|其他列:--------|:--------------------------------------|:-----|:----------123456789 | 2018年1月| 100英镑123456789 | 2019年1月| 100英镑123456789 |null|null|null123456789 |null|null|null123456789 |null|null|null987654321|null|null|null987654321|null|null|null987654321|null|null|null