2017-07-28 9 views
0

2つ以上の重複する行から1つを更新するにはどうすればよいですか?私は1つを保持し、他の人に新しい価値を更新したい。Firebirdの2つの複製から1つを更新 - より多くの行

簡単な例テーブル:あなたが使用しているFirebirdのバージョンの

one|two|three 
---------- 
1|milk|water 
1|milk|sugar 

答えて

1

one|two|three 
---------- 
1|milk|water 
1|milk|water 

から

わからない(分析関数は、バージョン3.0でサポートされている)と、次の構文が有効な場合(私は現時点でそれを確認できませんでした)、これを行うことができます:

update table 
set three='sugar' 
where row_number() over (partition by one, two)=1 

そうでない場合は、それを行うには別の、より複雑な方法は、次のようになります(未テスト)

select one, two, three 
from (
     select t1.one 
      ,t1.two 
      ,coalesce(t2.three, t1.three) as three 
      ,row_number() over (partition by t1.one, t1.two) as row_num 
     from table t1 
     left join (
       select one, two, 'sugar' as three, 1 as row_num 
       from (
         select distinct one, two, three 
         from table 
         group by one, two, three 
         having count(*) > 1 
         ) 
       ) t2 
     on t1.one=t2.one 
     and t1.two=t2.two 
     and t1.row_num=t2.row_num 
) 
2

http://www.ibexpert.net/ibe/index.php?n=Doc.TheMysteryOfRDBDBKEY

Select *, RDB$DB_KEY from MyExampleTable; 

その後、

Update MyExampleTable 
    Set Column=Value 
    Where RDB$DB_KEY=xxxxx; 

別のアプローチだろう私のものgストアドプロシージャ(または実行ブロック)を呼び出し、SQLカーソル変数を使用します。しかし、それは慎重なループ管理が必要なので、1行をスキップして2番目、3番目などを変更します。

https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql-coding.html#fblangref25-psql-tbl-declare-cursor

また https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-dml-update.html#fblangref25-dml-tbl-update


しかし、おそらく最も適切な方法は、そのテーブルに一意の主キー列を追加し、

+2

その一意の数値IDを使用することですでUPDATE ... WHERE CURRENT OF ...のための例を参照してください私は主キーを追加するために投票する –

関連する問題