2016-09-09 8 views
0

で何千ものレコードへの順次位置を割り当てる - ブタうまくいけば、これは直接のPostgreSQLを経由して解決することができ、私は、別のリストから10万項目を移動しようとしています: (位置は問わない)は、Ruby on Railsでの使用PostgreSQLの

- item 1, position: nil 
- item 2, position: nil 
- item 3, position: nil 

リストB:(位置は関係ありません)

一覧Aは

- item 4, position: 1 

、結果として

、私がしたい:

リストB:私は今のところについて考えてきました

- item 4, position: 1 
- item 1, position: 2 
- item 2, position: 3 
- item 3, position: 4 

様々な戦略:アイテムごと

  1. 1つのSQLクエリが、動的に100kの項目:(
  2. を移動するときに、これは遅くなりますリストごとに1つのSQLシーケンスを作成するが、私は一日あたりの1000の新しいリストを期待していて、これは間違ったアプローチのように感じている
  3. 位置を使用して設定されているリスト全体のため
  4. 1つのSQLクエリおそらくSQLループに依存している最大位置?
  5. 私はあなたがしようとしているものを全くわからない

答えて

0

(Redisのは、エンド・ソリューションに適しかもしれませんが、私が最初に利用可能なツールとソリューションを模索したいと思います)別のツールに問題を抽出しますここではやっているが、シーケンスはここでは最高の選択肢だと思う(しかし、ダイナミックに作られたものではなく、ほとんど常に悪い考えである)。実際にシーケンスを使用したくない場合は、window functionsと具体的にはrow_number windows関数を使用することもできます。

完全な例です。あなたには、いくつかのサンプルデータでは、次の表があるとします。

CREATE TABLE ListA (
    item integer NOT NULL, 
    position integer 
); 

はTABLE ListBの(NOT NULLと 項目の整数、 位置整数 )を作成します。あなたはListB停止からの位置番号を開始したい場合

SELECT item,row_number() OVER (ORDER BY item) 
FROM ListA; 

:その後、次のクエリは、(1から始まる)、それらに割り当てられた新しい位置にListAのすべての要素を返しますが、

INSERT INTO ListA(item) VALUES (1),(2),(3); 
INSERT INTO ListB(item,position) VALUES (4,1); 

、あなたはListBにそれらの行を追加し、最後にその

SELECT item,row_number() OVER (ORDER BY item)+(SELECT max(position) FROM ListB) 
FROM ListA; 

のようにそれを行うことができ、あなたはSのようなことを行うことができますO:

INSERT INTO ListB(item,position) 
SELECT item,row_number() OVER (ORDER BY item)+(SELECT max(position) FROM ListB) 
FROM ListA; 
関連する問題