-1

解決しようとしているこの問題に遭遇しました。毎日、ID番号を持つテーブルに新しいレコードをインポートしています。

それらのほとんどは新しいものですが(これまでシステムで見られたことはありません)、一部は再び登場しています。ID番号がアーカイブにある場合は、ID番号の末尾にアルファを追加する必要がありますが、これは、行のデータがアーカイブのデータと異なり、これを順番に実行する必要がある場合に限ります。 、IE、12345が2回目に異なるデータで表示された場合は、12345Aに変更し、12345が再度表示され、再び異なる場合は、12345Bに変更する必要があります。

もともと私は、whereすべての「再確認」レコードを一時テーブルに配置するループを使用してみました。次に、最初にAを割り当て、次にそれらを削除し、残っているものにBを割り当て、それらを削除するなど、一時テーブルが空ですが、それはうまくいきませんでした。

あるいは、次のようにサブクエリを試すことを考えていました。

update table
set IDNO= (select max idno from archive) plus 1

助言がありますか?

4

3 に答える 3

0

アイデアとしていかがでしょうか。これは基本的に疑似コードなので、必要に応じて調整してください。

すべてのデータが最終的に挿入されるテーブルとして「src」を使用し、一時テーブルとして「TMP」を使用します。これは、TMP の ID 列がdoubleであると想定しています。

do
    update tmp set id = id + 0.01 where id in (select id from src);
until no_rows_changed;

alter table TMP change id into id varchar(255);

update TMP set id = concat(int(id), chr((id - int(id)) * 100 + 64);

insert into SRC select * from tmp;
于 2011-07-07T21:04:37.393 に答える
0

これが私の最終的な解決策です:

update a
set IDnum=b.IDnum
from tempimiportable A inner join 
    (select * from archivetable
     where IDnum in 
     (select max(IDnum) from archivetable
      where IDnum in 
       (select IDnum from tempimporttable)
      group by left(IDnum,7) 
      )
     ) b
on b.IDnum like a.IDnum + '%'
WHERE 
*row from tempimport table = row from archive table*

着信行を古い行と同じ IDnum に設定し、次に

update a
set patient_account_number = case 
    when len((select max(IDnum) from archive where left(IDnum,7) = left(a.IDnum,7)))= 7 then a.IDnum + 'A'
    else left(a.IDnum,7) + char(ascii(right((select max(IDnum) from archive where left(IDnum,7) = left(a.IDnum,7)),1))+1)
    end
from tempimporttable a
where not exists ( *select rows from archive table* )

誰かがこれを深く掘り下げたいかどうかはわかりませんが、建設的な批判を歓迎します...

于 2011-07-12T13:19:46.360 に答える
0

12345Zに到達するとどうなりますか?

とにかく、テーブル構造を少し変更してください。レシピは次のとおりです。

  1. 上の任意のインデックスをドロップしますID

  2. ID(明らかに varchar) をID_Num(long int) とID_Alpha(varchar, not null)に分割します。ID_Alpha空の文字列 ( )の既定値を作成します''
    したがって、12345B (varchar) は12345 (long int) や'B' (varchar) などになります。

  3. ID_Num列およびに一意の、理想的にクラスター化されたインデックスを作成しますID_Alpha
    これを主キーにします。または、必要に応じて、自動インクリメント整数を疑似主キーとして使用します。

  4. これで、新しいデータを追加するときに、重複する ID 番号を見つけるのは簡単になり、簡単な操作で最後の ID_Alpha を取得できますmax()

  5. 重複する ID の解決は、while ループまたはカーソル (必要な場合) を使用して、より簡単なタスクになるはずです。
    ただし、「苦悶する行」(RBAR)を回避し、セットベースのアプローチを使用することも可能です。Jeff Moden の記事を数日間読むと、その点に関するアイデアが得られるはずです。

于 2011-07-09T23:15:18.123 に答える