ボーはブログでこの質問を公園を見に頼ま:表は二つのフィールドのIDと名前があり、idが連続空でない非繰り返しである、あなたは、隣接するテーブル名レコードの値を交換したい(シングルとダブル二十から二交流)。
さらに、最後の行は、単一のマッチングレコードは、次の行ではなく、最後の更新個々の行に対応していない場合。
ビット平均感じて、私は(オラクル)それを達成しようとすると、記録されました。
diososテーブルを作成します。
- テーブルが存在する場合、(テスト容易にするための)テーブルを削除 ドロップ 表; diososを - テーブルを作成する 作成 表 diosos(上記のid INT、名前VARCHAR(64を))。
テーブルにデータを挿入します。
- 插入数据 インサート に diosos(ID、名前)の値(1、' 1 ' )。 インサート に diosos(ID、名前)の値(2、' 2 ' )。 挿入 に diosos(ID、名前)の値(3、' 3 ' )。 インサート に diosos(ID、名前)の値(4、' 4 ' ); 挿入 に diosos(ID、名前)値が(5、' 5 ' )。 インサート に diosos(ID、名前)の値(6、' 6 ' )。 インサート に diosos(ID、名前)の値(7、' 7 ' )。 インサート に diosos(ID、名前)の値(8、' 8 ' )。 挿入 に diosos(ID、名前)の値(9、" 9");
クエリデータは、第1のために見に出ていないです。
- クエリデータ SELECT * から diosos。
近隣リストレコード交換(モノ二十から二エクスチェンジ)を達成、原理はパリティ判断のidモジュロ減算の名前は、接続IDと関連付けられている隣接する、合わせて更新された行んです。
- 更新し、2つのExchange間で、交換が不対でない 更新diosos D1 SETの d1.name = ( SELECT d2.name からdiosos D2 WHERE(MOD(d1.id、2)= 0 と d1.id =(d2.id + 1 )) 又は(MOD(d1.id、2)= 1 と d1.id =(d2.id - 。1 )) )は、 WHERE EXISTS(SELECT d3.id から D3 diosos どこd3.id =(d1.id + 1))。
クエリを再度、成功しました。
- 再クエリ SELECT * から diosos。
私は思うが、それでもかなり良い楽しさは、ハッハッハ、ほとんど実際のシーンはありません。
「すべてのエンディングを合わせ、自分の手です。」