2012-05-02 15 views
2

すでにテーブルにあるレコードの間にレコードを挿入したいと思います。 40000以上のレコードがあり、この新しいレコードを19位に配置したいと考えています。どうすればいいですか?レコードのリストの間に新しいレコードを挿入する

表データ::私たちはテーブルをチェックするとき

CREATE TABLE enum 
    (identifier VARCHAR2(64), 
    code VARCHAR2(512), 
    data VARCHAR2(4000)) 
/
INSERT ALL 
INTO enum VALUES ('HR_B_A', 'Halli, L6', 'Halli, L6') 
INTO enum VALUES ('HR_B_A', 'Halli, L7', 'Halli, L7') 
INTO enum VALUES ('HR_B_A', 'Halli, L8', 'Halli, L8') 
INTO enum VALUES ('HR_B_A', 'Halli, L9', 'Halli, L9') 
INTO enum VALUES ('HR_B_A', 'Halli, P6', 'Halli, P6') 
INTO enum VALUES ('HR_B_A', 'Halli, P7', 'Halli, P7') 
select * from dual 
/

だから、我々が得る:私が望む何

SELECT * FROM enum 

IDENTIFIER  CODE   DATA 
---------- --------- --------- 
HR_B_A  Halli, L6 Halli, L6 
HR_B_A  Halli, L7 Halli, L7 
HR_B_A  Halli, L8 Halli, L8 
HR_B_A  Halli, L9 Halli, L9 
HR_B_A  Halli, P6 Halli, P6 
HR_B_A  Halli, P7 Halli, P7 

は持っている

のは、5つのレコードでの例を考えてみましょう選択クエリを実行します。

SELECT * from enum 

IDENTIFIER  CODE   DATA 
    ---------- --------- --------- 
    HR_B_A  Halli, L6 Halli, L6 
    HR_B_A  Halli, L7 Halli, L7 
    HR_B_A  Halli, L8 Halli, L8 
    HR_B_A  Halli, L9 Halli, L9 
    HR_B_A  Halli, L10 Halli, L10 
    HR_B_A  Halli, P6 Halli, P6 
    HR_B_A  Halli, P7 Halli, P7 

私が考えることができる唯一の方法は、L9行をテーブル(例えばenum_temp)に転送し、L10行を挿入し、そのテーブルの残りのデータを転送することです。しかし、私はクエリの構文を把握していないようです。リレーショナルデータベース内

答えて

8

行:-)事前に

おかげで

あなたのSELECTでORDER BY表現を使用しない限り、あなたは、任意の順序を保証することができる方法はありませんをソートされません。

あなたは自分の価値観では「情報」のいくつかのタイプを混合しているとして、あなたはこのようなものを使用する必要があります。

select * 
from enum 
order by regexp_replace(code, '[0-9]', ''), 
     to_number(regexp_replace(code, '[^0-9]', '')) 

含まれていないコードの一部による発現の受注により、一次数字。そうすれば、すべてHalli, L値が一緒にソートされます。次に2番目の式では、コードの数値によってソートされます(すべての非数字文字が取り除かれます)。

3

レコードがテーブルに格納される方法に暗黙の順序はありません。照会でソートを使用して、希望の順序でリストを表示することができます。

POSITION列(タイプNUMBER)を追加すると、リスト内のレコードの位置を示すことができます。そして、あなたがリストのn番目の位置にレコードを挿入する場合の操作を行います。

UPDATE enum SET position = position + 1 WHERE position >= <desired nth position> 
INSERT INTO enum VALUES(<desired nth position>, ....) 

を行うためには、リストを表示する:

SELECT * FROM enum ORDER BY position ASC 

EDIT:と位置にインデックスを追加クエリを高速にするための列(型Bツリーインデックス)

関連する問題