【问题标题】:Stored Procedure for upgrading Bags to Lists将 Bags 升级为 Lists 的存储过程
【发布时间】:2013-07-25 02:29:12
【问题描述】:

我最近刚刚将一些休眠映射类的语义更改为列表。添加列表索引列本身是微不足道的,但以合理的方式填充它似乎不那么微不足道。我最终编写了以下存储过程(PL/pgsql),它通过循环遍历按引用列排序的表的所有行并将索引设置为 0、1、2、3 等,直到找到新的引用号.它解决了问题,但我想知道是否有更简单的方法可以达到相同的结果。

  CREATE OR REPLACE FUNCTION setlistorderfunc(VARCHAR, VARCHAR) RETURNS VOID AS $$
  DECLARE
    currIndex INTEGER := 0;
    currResource INTEGER := 0;
    r RECORD;
  BEGIN
    FOR r IN execute 'SELECT id id, '|| $2 || ' res, resource_list_order rlo FROM ' || $1 || ' ORDER BY res ASC, rlo ASC' LOOP
      IF currResource != r.res THEN
        currResource := r.res;
        currIndex := 0;
      ELSE
        currIndex := currIndex + 1;
      END IF;
      EXECUTE 'UPDATE ' || $1 || ' set resource_list_order = ' || currIndex || 'WHERE id = ' || r.id;
    END LOOP;
  END;
  $$ LANGUAGE plpgsql;

要升级资源上的 ratings 包(由名为 about_resource 的列链接)然后我这样做:

  SELECT setlistorderfunc('rating', 'about_resource');

【问题讨论】:

    标签: sql hibernate stored-procedures postgresql-9.1 plpgsql


    【解决方案1】:

    在子查询中使用window function row_number(),并加入UPDATE 中的结果以大大简化此操作:

    UPDATE rating r
    SET    resource_list_order = sub.rn
    FROM  (
        SELECT id, row_number() OVER (PARTITION BY about_resource
                                      ORDER BY resource_list_order) - 1 AS rn
        FROM   rating
        ) sub
    WHERE  r.id = sub.id;
    

    【讨论】:

      猜你喜欢
      • 2011-10-22
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 2013-10-10
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      相关资源
      最近更新 更多