2017-06-19 12 views

答えて

1

DBFiddle Demo of Update Statement

窓の分析機能をサポートしていない、これを達成するために少しトリッキーになります。同様のロジックを使用してbefore insertトリガーを作成することもできます。

仮定:

  1. Numberこの場合2のように、任意の整数で始まり、1によって増加します。したがって、既存のデータに欠落したシーケンスはありません。ここaa < aaa < ab < ac

  2. 英数字ソートが適用可能です。これは、文字列の各文字のascii値に基づいて、最初の文字から始まるRDBMSによって行われます。

  3. abは、idなしで挿入しています。下の更新ステートメントの実行後、idはこのvalに割り当てられます。同様のロジックを使用して、before insertトリガーで同じことを達成できます。

new_idを最初に問い合わせてください。

select t.*, 
    (select count(*) from test t1 where t.val>=t1.val) + 
     o.diff as new_id 
from test t 
cross join 
(select * from 
    (select t.*,(select count(*) from test t1 where t.val>=t1.val) as rn , 
     id - (select count(*) from test t1 where t.val>=t1.val) as diff 
    from test t 
    ) where rn=1 
) o 

出力

+------+-----+--------+ 
| id | val | new_id | 
+------+-----+--------+ 
| 2 | aa |  2 | 
| 3 | ac |  4 | 
| null | ab |  3 | 
+------+-----+--------+ 

私たちは実際のidmin_iddifferenceを決定する必要が最初のように私はcross joinを使用しています。上記の場合と同様に、1からnまでの数字を生成すると、あなたのIDは2で始まります。したがって、これら2つのdiff1です。これは、生成されたIDをすべて追加して、new_idになります。もっと簡単なアプローチがあるかもしれませんが、これは私が今考えることのできるすべてです。

ここでは、更新ステートメントでこのクエリを使用してidnew_idに更新します。

update test 
set id = (select tb.new_id from 
      (select t.*, 
       (select count(*) from test t1 where t.val>=t1.val) + 
        o.diff as new_id 
       from test t 
      cross join 
       (select * from 
        (select t.*,(select count(*) from test t1 where t.val>=t1.val) as rn , 
         id - (select count(*) from test t1 where t.val>=t1.val) as diff 
        from test t 
        ) where rn=1 
       ) o 
      ) tb 
      where test.val=tb.val 
     ) 
where exists 
    (select * From (select t.*, 
         (select count(*) from test t1 where t.val>=t1.val) + 
          o.diff as new_id 
         from test t 
        cross join 
         (select * from 
          (select t.*,(select count(*) from test t1 where t.val>=t1.val) as rn , 
           id - (select count(*) from test t1 where t.val>=t1.val) as diff 
          from test t 
          ) where rn=1 
         ) o 
        ) tb 
    where test.val=tb.val 
    ); 
関連する問題