【问题标题】:Oracle SQL to Update rows in repeating patternOracle SQL 以重复模式更新行
【发布时间】:2021-12-09 12:44:49
【问题描述】:

如何使用给定的重复数字序列更新行。 我的表如下

line_type line_val line_pattern
A 1 null
A 2 null
B 5 null
B 6 null
C 3 null
C 4 null

现在我想用重复模式 8532 更新列值 所以更新后的表格会是这样的

line_type line_val line_pattern
A 1 8
A 2 5
B 5 3
B 6 2
C 3 8
C 4 5

如何在更新语句中实现这一点?

【问题讨论】:

  • 请描述为新列分配值的规则,展示您当前的尝试并描述它的问题所在。另请注意,SQL 表没有任何固有顺序,它是一个集合,因此没有任何第 N 行,除非您明确指定排序条件。

标签: sql oracle sql-update


【解决方案1】:

您提供的数据无法满足您的要求。表中的数据不按特定顺序存储。如果希望在 select 语句中保证顺序,则需要提供ORDER BY 子句。

在下面的代码中,有一个额外的列“ORDER_BY”来指定需要处理记录的顺序。使用 MOD 函数计算重复模式,将行号转换为 4 个数字的重复序列,然后 CASE 将这些数字中的每一个映射到其各自的模式位置。

WITH test_data (order_by, line_type, line_val)
AS
(
SELECT 1, 'A',1 FROM DUAL UNION ALL 
SELECT 2, 'A',2 FROM DUAL UNION ALL 
SELECT 3, 'B',5 FROM DUAL UNION ALL 
SELECT 4, 'B',6 FROM DUAL UNION ALL 
SELECT 5, 'C',3 FROM DUAL UNION ALL 
SELECT 6, 'C',4 FROM DUAL  
)
SELECT
  CASE MOD(ROW_NUMBER() OVER (ORDER BY order_by),4)
    WHEN 1 THEN 8
    WHEN 2 THEN 5
    WHEN 3 THEN 3
    WHEN 0 THEN 2
  END as line_pattern,
  t.*
  FROM
  test_data t

LINE_PATTERN   ORDER_BY L   LINE_VAL
------------ ---------- - ----------
           8          1 A          1
           5          2 A          2
           3          3 B          5
           2          4 B          6
           8          5 C          3
           5          6 C          4

【讨论】:

  • 感谢科恩!!!你的解决方案对我有用。
【解决方案2】:

如果您不关心订单,请使用此表单:

UPDATE mytable
   SET line_pattern =
           CASE MOD (ROWNUM, 4)
               WHEN 1 THEN 8
               WHEN 2 THEN 5
               WHEN 3 THEN 3
               WHEN 0 THEN 2
           END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多