2012-05-02 98 views
2

我想在已經在表格中的記錄之間插入記錄。有超過40000條記錄,我想把這個新紀錄放在第19位。我該怎麼做?在記錄列表之間插入新記錄

讓我們考慮用5個履歷的一例:

表數據:

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 

我想吃些什麼時我運行選擇查詢:

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

行的關係數據庫不排序

有沒有辦法可以確保任何所需的順序,除非你在選擇使用ORDER BY表達。

當你混合幾種類型的在你的價值觀「信息」,您將需要使用這樣的:由不包含代碼的一部分

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

第一個ORDER BY表達式訂單數字。這樣所有的Halli, L值都被排序在一起。表達式的第二順序然後按代碼的數值進行排序(剝離所有非數字字符)。

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 

編輯:與上位添加一個索引列(類型b-tree索引)讓您的查詢更快更快