0

ソート順が重複しているレコードが数千あるため(他のクエリでエントリが重複する原因になります)、これらすべてのレコードに正しいソート順を設定しようとしています。

まず、並べ替え順序が0から始まるように、すべてを-1に設定してから、次のクエリを実行します。

UPDATE op.customeraddress SET sortorder = (SELECT MAX(ca.sortorder) + 1 
                                           FROM op.customeraddress AS ca 
                                           WHERE ca.customerid = customeraddress.customerid) 
WHERE id IN (<subquery for IDs>)

問題は、サブクエリのMAX()が常に同じ値を返すように見えることです。これは、以前の更新について認識していません。

レコードごとに手動で適用すると、クエリは正常に機能します。

ループに頼ることなくこれを行う方法についてのアイデアはありますか?

4

2 に答える 2

2

これはそれを行う必要があります:

with new_order as 
(
   select ctid as rid,
          row_number() over (partition by customerid order by sortorder) as rn
   from customeraddress
) 
update customeraddress ca
  set sortorder = new_order.rn 
where ca.ctid = new_order.rid;
  and ca.id IN (<subquery for IDs>);

これを実行する前にソート順をリセットする必要はありません。古い順序に従って、1つのcustomeridのすべてのcustomeraddressに番号が付け直されます。

上記のソリューションにはPostgreSQL9.1が必要です(書き込み可能なCTE)

以前のバージョンの場合、これはそれを行う必要があります:

update customeraddress ca
   set ca.sortorder = t.sortorder
from 
(
   select ctid as rid,
          row_number() over (partition by customerid order by sortorder) as rn
   from customeraddress
)  t
where ca.ctid = t.rid
  and ca.id IN (<subquery for IDs>);
于 2012-06-14T22:04:12.967 に答える
0

次のシーケンスを使用できます。

CREATE TEMPORARY SEQUENCE sort_seq;
UPDATE op.customeraddress SET sort_order = (
     SELECT nextval('sort_seq')
     FROM op.customeraddress AS ca 
     WHERE ca.customerid = customeraddress.customerid
) WHERE id IN ...
于 2012-06-14T00:01:59.537 に答える