0

group by の結果に基づいてテーブルを更新する

解決しようとしている厄介な更新の問題があります。次のように、同じ 3 つの列と追加のさまざまな列を含む 2 つのテーブルがあります。

Table1 {pers_id, loc_id, pos, ... }

Table2 {pers_id, loc_id, pos, ... }

どのフィールドも一意ではありません。最初の 2 つのフィールドは、テーブル (またはテーブル) 内のレコードをまとめて、同じエンティティに属するものとして識別します。テーブル 1 にはエンティティに属する 15 のレコードがあり、テーブル 2 には同じエンティティに属する 4 つのレコードがある可能性があります。3 番目の列 'pos' は 0 から任意の値までのインデックスで、これが更新しようとしている列です。

Table1 と Table2 では、pos 列は 0 から始まり、ユーザーの選択に基づいて増加します。そのため、例 (table1 に 15 レコード、table2 に 4 レコード) では、table1 には 0 から 14 の「pos」値が含まれ、Table2 には0 ~ 3 の「pos」値が含まれます。

Table1 の pos フィールドを、Table2 の類似エンティティのカウント結果でインクリメントしたいと考えています。これは、table2 からの結果を正しく返す sql ステートメントです。

select table2.pers_id, table2.loc_id, count(*) as pos_increment from table2 group by table2.pers_id, table2.loc_id;

更新の最終結果は、例 (table1 に 15 レコード、table2 に 4 レコード) では、同じエンティティの Table1 のすべてのレコードが 4 ずつインクリメントされます (特定のエンティティ グループ化の結果)。0 は 4、15 から 19 などに変更されます。

これは単一のステートメントで達成できますか?

4

2 に答える 2

1

フィールドをインクリメントするだけでよいためpos、ソリューションは非常に簡単です。

update table1 t1
set    t1.pos = t1.pos + 
   (select count(1)
    from   table2 t2
    where  t2.pers_id = t1.pers_id
    and    t2.loc_id  = t1.loc_id)
于 2013-01-17T14:45:02.793 に答える
0

はい、可能です。これらの更新の一部に MERGE を使用できます。また、更新と副選択の間で値を関連付ける方法があります。私は過去にこれを行ったことがありますが、それはトリッキーであり、既存の例がありません。

このサイトでいくつかの例を見つけることができます。一部は Oracle 用で、一部はその他のデータベース用で、わずかな変更で機能します。

于 2013-01-17T14:19:13.933 に答える