[pgsql-jp: 34262] 同一テーブル内での列コピー
it_555_it @ excite.co.jp
it_555_it @ excite.co.jp
2004年 11月 11日 (木) 23:06:33 JST
こんばんは。
島田と申します。
test --- pk(id,name), date1(not null)
id name date1 date2
-----------------------------
1 a 2004/10/1 2004/11/1
2 a 2004/12/1
3 b 2005/1/1 2005/2/1
4 c 2005/2/1
〜〜〜 snip 〜〜〜
上記のようなテーブルがあり、date2がNULLの時には、
date1の値をそのままdate2に移行したいと思っています。
レコード数は2万ほどあり、極端に時間のかかる処理(5分以上)はNGです。
実は、SQLで簡単にできればそうしたいですし、
プロシージャでも工夫をすれば、負荷をかけずにスマートにできるということであればそうしたいと思っています。
もし、いずれも駄目な場合には、PHPでファイルに落として、\COPYを絡めて、
やっていこうと思っています。
スマートで簡単な方法があるようでしたらば、教えて頂けたらと思います。
以下書いてみたplpgsqlです。
2万行では一体いくらかかるのか、というくらい待たされて諦めました。
CREATE OR REPLACE FUNCTION date_to_date()
RETURNS INTEGER AS '
DECLARE
var_id TEXT;
var_name TEXT;
i INTEGER;
j INTEGER;
k INTEGER;
numrows INTEGER;
BEGIN
SELECT count(*) INTO j FROM test;
FOR i IN 1..j LOOP
SELECT i - 1 INTO k;
SELECT id INTO var_id FROM test ORDER BY id,name LIMIT 1 OFFSET k;
SELECT name INTO var_name FROM test ORDER BY id,name LIMIT 1 OFFSET k;
UPDATE test SET date2 = (SELECT date1 FROM test WHERE id = var_id AND name = var_name)
WHERE date2 IS NULL AND id = var_id AND name = var_name;
END LOOP;
SELECT count(*) INTO numrows FROM test WHERE date2 IS NOT NULL;
RETURN numrows;
END;
'
LANGUAGE 'plpgsql';
SELECT date_to_date();
DROP FUNCTION date_to_date();
pgsql-jp メーリングリストの案内