【问题标题】:Update Value in same Primary Key更新同一主键中的值
【发布时间】:2021-03-06 10:09:06
【问题描述】:

我正在尝试更新同一主键中的值,其中第一行值将应用于第二个序列,直到具有主键值的序列结束。

这是我的示例场景

这应该是预期的输出。

我也不想更新已经有值的行。这可能吗? 我不知道如何使用此输出来实现。谁能帮我?我正在使用 SQL。

谢谢

【问题讨论】:

  • 同一个主键是什么意思。 2行主键不能相同?
  • 对不起,我的例子没有理解。我想说的是我的示例的主键是列(ID,SEQUENCE)。并且必须更新与上面示例相同的 ID 范围内的值
  • 知道了。还有一个问题,您是否必须始终选择序列1 的值?

标签: sql sql-server sql-server-2008 sql-server-2012 sql-update


【解决方案1】:

您可以使用窗口函数和可更新的 CTE。

如果每个id 只有一个非null 值,则窗口最小值或最大值就足够了:

with cte as (
    select value, min(value) over(partition by id) as new_value
    from mytable t
)
update cte set value = new_value where value is null

如果您特别想要sequence 具有值1 的行,请使用条件窗口聚合:

with cte as (
    select value, 
        min(case when sequence = 1 then value end) over(partition by id) as new_value
    from mytable t
)
update cte set value = new_value where value is null

最后,如果你想要sequence最小的那一行,不管它的实际值是多少:

with cte as (
    select value, 
        first_value(value) over(partition by id order by sequence) as new_value
    from mytable t
)
update cte set value = new_value where value is null

【讨论】:

  • 感谢您的回答@GMB,但很抱歉迟到通知.. 不过我正在更新我的问题。问题是我不想更新现有值
  • @davinceleecode:这不会更新现有值 - 外部查询中的条件 where value is null 保证仅更新 null 值。
【解决方案2】:

DENSE_RANK 窗口函数对于这种类型的序列很方便。如果目标只是返回值,则无需存储,直接在select中获取即可。

DECLARE @Test as Table (
    Id char(1),
    Seq int,
    Val varchar(10)
)

INSERT @Test (Id, Seq)
VALUES
    ('A','1'),
    ('A','2'),
    ('A','3'),
    ('A','4'),
    ('A','5'),
    ('B','1'),
    ('B','2'),
    ('B','3'),
    ('B','4'),
    ('C','4'),
    ('C','5');

-- Select Only

SELECT Id, Seq, 
    'Test' + LTRIM(STR(DENSE_RANK() OVER (ORDER BY Id))) as [Val]
FROM @Test

-- Update via derived table

UPDATE t
SET Val = 'Test' + LTRIM(STR(Seq2))
FROM @Test t
INNER JOIN (
    SELECT Id, Seq, DENSE_RANK() OVER (ORDER BY Id) as [Seq2]
    FROM @Test
) v
ON v.Id = t.Id AND v.Seq = t.Seq

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    相关资源
    最近更新 更多