1

次の問題がありLISTます: 5 列のテーブルがあります:

  1. リスト項目
  2. 製品番号
  3. 参照番号
  4. 部品番号

100 000 rowsこの表のあたりにあります。テーブルもpartありhistory、すべてpart_number列があります。

update LIST.state column with value 1, 2 or 3 where LIST.refNo = some value次の状況の結果に応じて、次のことが必要になります。

If LIST.part_number does not exist in table part.part_number
    set LIST.state to 1.
If it does, if this part_number and corresponding date in history is less than a week,
    set LIST.State to 2. Else set it to 3.

を使用してpostgreSQLいます。どんな助けでも大歓迎です。これまでのところ、次の簡単なIF ELSEステートメントの使用方法を知っています。

DO
$BODY$
BEGIN
    IF EXISTS (SELECT part_number FROM part WHERE refNo=7000) THEN

    ELSE 
        UPDATE LIST set state = 1
    END IF;
END;
$BODY$

これは最善のアプローチではないと思います。これを if ループで囲む必要があり、 があるためover 200 000 rows in history table、1つずつ比較すると非常に遅くなります。

最初にパーツ テーブルに存在する値を選択し、クエリを実行して履歴から値を取得できますか?

4

2 に答える 2

1

一度に基づいてすべての値を更新する3つの個別のクエリでこれを行うことができます(Erwinsの回答のように、1つで行う方法があると確信しています)ref no

このような:

--First
UPDATE LIST 
SET STATE = 1 
WHERE NOT PART_NUM 
IN (SELECT PART_NUM 
    FROM PART) 
AND REF_no = 1000;
--Second
UPDATE LIST
SET STATE = 2
WHERE PART_NUM IN
         (SELECT PART_NUM 
          FROM HISTORY 
          WHERE age(TIME, CURRENT_TIMESTAMP) > (INTERVAL '-7 days'))
AND REF_NO = 1000;
--Third
UPDATE LIST
SET STATE = 3
WHERE STATE NOT IN(1,2)
AND REF_NO = 1000

これはあまりエレガントではありませんが、実行する必要があります。これが最速の方法であるかどうかもわかりません。

ここにSQLFiddleがあります

于 2013-07-16T03:38:46.187 に答える