追加表格并添加记录以涵盖一年中的所有日期

问题描述 投票:0回答:1

我有2张桌子。我想通过表 A 中的信息附加表 B。问题是每个项目都有其有效期,并且在摄取表 A 项目后,表 B 中的记录必须涵盖一年中的每一天(或 2 年,如我在链接中的示例)。表 B 中的期间不能重叠,并且表 B 中的项目不能删除。展示可能比解释更容易。

here is the example

sql sql-server join append
1个回答
0
投票

对于表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
© www.soinside.com 2019 - 2024. All rights reserved.