2つ以上の重複する行から1つを更新するにはどうすればよいですか?私は1つを保持し、他の人に新しい価値を更新したい。Firebirdの2つの複製から1つを更新 - より多くの行
簡単な例テーブル:あなたが使用しているFirebirdのバージョンの
one|two|three
----------
1|milk|water
1|milk|sugar
2つ以上の重複する行から1つを更新するにはどうすればよいですか?私は1つを保持し、他の人に新しい価値を更新したい。Firebirdの2つの複製から1つを更新 - より多くの行
簡単な例テーブル:あなたが使用しているFirebirdのバージョンの
one|two|three
----------
1|milk|water
1|milk|sugar
へ
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
)
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番目などを変更します。
しかし、おそらく最も適切な方法は、そのテーブルに一意の主キー列を追加し、
その一意の数値IDを使用することですで
UPDATE ... WHERE CURRENT OF ...
のための例を参照してください私は主キーを追加するために投票する –