【问题标题】:Updating Rows in a normalized table更新规范化表中的行
【发布时间】:2020-08-29 03:23:15
【问题描述】:

标准化表

ID SEQ Type Value Flag
1  1   a    100   -
1  2   a    200   -
1  3   a    250   -
1  4   b    200   -
2  1   a    150   -
2  2   b    100   -
2  3   b    200   -

如何编写单个更新语句,以便按如下方式填充结果表

ID SEQ Type Value Flag
1  1   a    100   valid
1  2   a    200   repeat
1  3   a    250   repeat
1  4   b    200   valid
2  1   a    150   valid
2  2   b    100   valid
2  3   b    200   repeat

编辑:包含 seq 列

只有第一次出现的 ID 组类型的值应该具有有效标志 它应该写成两个单独的更新语句吗? 有人可以澄清我吗? 非常感谢

【问题讨论】:

  • 您使用的是哪个 SQL 引擎?
  • @zealous,甲骨文
  • 你在填充规范化表吗?
  • @zealous,是的,该表已填充,但标志列一开始将为空
  • @zealous,包括一个 seq 列

标签: sql normalization


【解决方案1】:

首先使用row_number() 填充表,然后更新表。

选项 1:

select
    Id,
    Type,
    Value,
    null as Flag,
    row_number() over (partition by ID, Type order by SEQ) as rnk
from yourTable

那么你可以使用update

update yourTable
set flag = case
                when rnk = 1 then 'valid'
                else 'repeat'
            end

选项 2: 您可以不使用update 语句,如下所示

select
    Id,
    SEQ,
    Type,
    Value,
    case
        when rnk = 1 then 'valid'
        else 'repeat'
    end as flag
from
(
    select
        Id,
        SEQ,
        Type,
        Value,
        row_number() over (partition by ID, Type order by SEQ) as rnk
    from yourTable
) val

【讨论】:

  • @CrystalPaladin 上面的更新语句没有工作吗?
  • @CrystalPaladin 试试我上面提供的update 声明。
  • @CrystalPaladin 很乐意为您提供帮助。
  • 是否可以将排名结果与表连接并在单个语句中使用更新?
  • @CrystalPaladin 请试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 2011-09-24
  • 2013-01-11
  • 2013-03-08
  • 2016-01-31
  • 2011-03-14
  • 2018-02-02
相关资源
最近更新 更多