使用 cte 更新列值

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

在此输入图像描述 附件是我的桌子。有人可以帮忙吗?我正在寻找更新列值。 对于每个item_id并基于agreem_id A,我想更新term-0,12,24,36。当 Agreem_id 更改为 B 时,它应该仅更新 0,12,24。

我尝试使用cte

with cte as
(select 0 n
    union all 
select n + 12 from cte where n < 36
)

select * from cte

但是当agreem_id改变时这不会改变

[在此处输入图像描述][2]

common-table-expression updates
1个回答
0
投票

要根据

TERM
更新每个
ITEM_ID
AGREEM_ID
列,我们可以使用公共表表达式 (CTE) 生成所需的
TERM
值,然后执行
UPDATE
操作。 CTE 将生成必要的项(
AGREEM_ID
A 为 0、12、24、36,
AGREEM_ID
B 为 0、12、24),并且
UPDATE
会将这些项分配给相应的行。

下面是实现此目的的 SQL 脚本:

-- Create the CTE to generate the terms
WITH CTE_Terms AS (
    SELECT 0 AS TERM, 'A' AS AGREEM_ID
    UNION ALL
    SELECT 12, 'A'
    UNION ALL
    SELECT 24, 'A'
    UNION ALL
    SELECT 36, 'A'
    UNION ALL
    SELECT 0, 'B'
    UNION ALL
    SELECT 12, 'B'
    UNION ALL
    SELECT 24, 'B'
)
-- Update the main table based on the CTE
UPDATE main_table
SET TERM = CTE_Terms.TERM
FROM your_table_name AS main_table
JOIN (
    SELECT 
        ITEM_ID, 
        AGREEM_ID, 
        TERM,
        ROW_NUMBER() OVER (PARTITION BY ITEM_ID, AGREEM_ID ORDER BY (SELECT NULL)) AS RowNum
    FROM CTE_Terms
) AS CTE_Terms
ON main_table.ITEM_ID = CTE_Terms.ITEM_ID
AND main_table.AGREEM_ID = CTE_Terms.AGREEM_ID
AND main_table.RowNum = (
    SELECT COUNT(*)
    FROM your_table_name AS mt
    WHERE mt.ITEM_ID = main_table.ITEM_ID
    AND mt.AGREEM_ID = main_table.AGREEM_ID
    AND mt.TERM IS NOT NULL
    ) + 1;

-- Verify the results
SELECT * FROM your_table_name;

说明:

  1. CTE_条款

    • 此 CTE 根据
      TERM
      生成所需的
      AGREEM_ID
      值。
    • 它为
      TERM
      A 的
      AGREEM_ID
      值 (0, 12, 24, 36) 创建行,为
      AGREEM_ID
      B 创建 (0, 12, 24) 行。
  2. 更新声明

    • UPDATE
      语句将主表与CTE连接起来。
    • ROW_NUMBER
      窗口函数用于为每个
      ITEM_ID
      AGREEM_ID
      对生成行号。
    • RowNum
      用于确保为每行分配正确的
      TERM
      值。
  3. 验证

    • 最后的
      SELECT
      语句用于验证更新后的表。

请将

your_table_name
替换为您的桌子的实际名称。

此脚本假设表结构和数据类型与提供的图像和描述中显示的一致。可能需要根据确切的架构和要求进行调整。

© www.soinside.com 2019 - 2024. All rights reserved.