0

最近、いくつかの休止状態にマップされたクラスのセマンティクスをリストに変更しました。リストのインデックス列を追加すること自体は簡単ですが、適切な方法でデータを設定することはそれほど簡単ではないように思えました。私は次のストアド プロシージャ (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;

ratingリソース ( という名前の列でリンクされている) のバッグをアップグレードするには、次のabout_resourceようにします。

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

1 に答える 1

1

サブクエリでウィンドウ関数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;
于 2013-07-25T02:46:48.890 に答える