0
UPDATE wlog 
  SET g_log = ( SELECT glog_id 
                FROM glog_wlog 
                WHERE w_id=wlog.id limit 5) 
WHERE g_log is NULL;

私の古いDBはマッピングテーブルで構成されてい"glog_wlog"ました。今、それが参照する方法を変更する必要があります。上記のコードは正常に動作します。しかし、制限 5 は実際には何もしません。テーブルには 100 万を超える再コードがあります。一度にすべてを変換したくありません。では、それを任意の数に分割するにはどうすればよいでしょうか。

4

1 に答える 1

2

CTEを使用して、表示しているレコードを制限し、この種のサブセットを実行できます。

例えば:

with wlog_targets as (
    select id from wlog
    where g_log is null
    limit 5)
update wlog
set
    g_log = g.glog_id
from wlog_targets w
inner join glog_wlog g
    on w.id = g.w_id
where 
    wlog.id = w.id;

このアプローチでは、wlog_targets CTEを使用して、処理するwlogレコードの小さなサブセットを抽出します。

これには、選択した5つのレコードにglog_wlogのエントリがない場合、何も更新されないという問題があります。また、CTEはソートされていないため、5つのレコードが返される可能性があります。

于 2013-03-05T11:14:56.607 に答える