代码之家  ›  专栏  ›  技术社区  ›  RC.

Oracle 10g PL/SQL-选择结果作为更新列值

  •  1
  • RC.  · 技术社区  · 17 年前

    在Oracle 10g中,是否有一种方法可以使用查询中的记录值轻松/优雅地更新表中的多列?

    ID KEY .

    ID     Key
    ----   ---- 
    1        1000
    2        1000
    3        5000
    4        1000
    ..
    101      8000
    102      9000
    103      7000
    104      9000
    ...
    201         5
    202         5
    ...
    

    KeyMap trunc(ID/100) 并将其用作 batchID 其中列是批内ID的关键映射:

    trunc(ID/100)   key1   key2   key3   key4 ..... key99
    -------------   ----   ----   ----   ----
    0               1000   1000   5000   1000
    1               8000   9000   7000   9000
    2                  5      5               
    

    Key

    2 回复  |  直到 9 年前
        1
  •  8
  •   Steve Broberg    17 年前

    我将限制我的批评,说你的桌子设计没有规范化,也不是很漂亮,但我假设你有你的理由。我通常通过使用DECODE结合聚合列进行这些“旋转”查询,按我的键分组——在这种情况下,是你的伪键trunc(ID/100)。将其与使用元组的更新语法相结合:

     UPDATE Foo
        SET (a, b, c, d)
          = (w, x, y, z);
    

    你会得到:

      UPDATE KeyMap
         SET
           ( key1
           , key2
           , key3
           , key4
           ...
           , key99
           )
           = ( SELECT MAX(decode(mod(ID, 100), 1, Key, NULL))
                    , MAX(decode(mod(ID, 100), 2, Key, NULL))
                    , MAX(decode(mod(ID, 100), 3, Key, NULL))
                    , MAX(decode(mod(ID, 100), 4, Key, NULL))
                    ...
                    , MAX(decode(mod(ID, 100), 99, Key, NULL))
                 FROM Source
                WHERE Trunc(Source.ID / 100) = KeyMap.batchId
                GROUP BY Trunc(Source.ID / 100)
             )
       WHERE BatchId = <x>;
    
        2
  •  0
  •   akf    17 年前

    您可以生成Oracle VARRAY 并分批交钥匙。您的过程可以迭代VARRAY并更新表。