我有2张桌子。我想通过表 A 中的信息附加表 B。问题是每个项目都有其有效期,并且在摄取表 A 项目后,表 B 中的记录必须涵盖一年中的每一天(或 2 年,如我在链接中的示例)。表 B 中的期间不能重叠,并且表 B 中的项目不能删除。展示可能比解释更容易。
对于表A中的每一项,检查其在有效期内是否存在于表B中。 如果B表中不存在该项目,则插入A表中的有效期。 如果表B中存在该项目,请调整有效期以确保覆盖范围不重叠。
这是代码:
WITH cte1 AS (
SELECT
a.item,
a.valid_from,
a.valid_to,
b.valid_from AS b_valid_from,
b.valid_to AS b_valid_to
FROM
tableA a
LEFT JOIN
tableB b ON a.item = b.item AND b.valid_to >= a.valid_from AND b.valid_from <= a.valid_to
WHERE
b.item IS NULL
OR b.valid_from > a.valid_from
OR b.valid_to < a.valid_to
),
cte2 AS (
SELECT
*,
CASE
WHEN valid_from < b_valid_from THEN valid_from
ELSE b_valid_to + INTERVAL '1 day'
END as new_valid_from,
CASE
WHEN valid_to > b_valid_to THEN valid_to
ELSE b_valid_from - INTERVAL '1 day'
END as new_valid_to
FROM
cte1
)
INSERT INTO tableB (item, valid_from, valid_to)
SELECT
item,
new_valid_from,
new_valid_to
FROM
cte2
WHERE
new_valid_from <= new_valid_to