簡體   English   中英

如何同時插入兩個表

[英]How to insert into two tables at the same time

我希望我能正確解釋。 我需要將數據插入兩個數據庫表中。 此數據已存儲在其他兩個表中,但需要遷移。 為了簡化起見,可以說這是我的源表:

具有列folderid,foldername的文件夾

與列linkid,url和folderid鏈接

我的目標表是:

new_folder,具有列folderid,foldername

new_link帶有列linkid,url和folderid的列

也有其他專欄,但它們並不重要。 我的問題是,設置原始數據庫的任何人都使用Java中的隨機數生成器來創建文件夾和鏈接ID,而這些數字是完全垃圾。 需要用數據庫中存在的序列生成的數字替換它們。

因此,我需要一個執行如下操作的語句:

insert into new_folder(folderid, foldername), new_link(linkid, url, folderid)
values (select seq_folder_id.nextval, foldername, seq_link_id.nextval, url, seq_folder_id.currval from folder, link where folder.folderid = link.folderid).

文件夾可能有多個鏈接。 文件夾表中有20萬行,鏈接表中有10倍,因此我需要某種腳本來運行並拉出所有文件夾,並以新序列作為ID創建新條目。 單獨這樣做會很好,但是如果我這樣做,那么一旦ID更改,我就無法將鏈接映射到文件夾,除非我在一個聲明中這樣做就行了。

這是有關多表插入的很好的教程:

http://www.oracle-developer.net/display.php?id=209

基本結構是:

INSERT ALL|FIRST
   [WHEN condition THEN] INTO target [VALUES]
   [WHEN condition THEN] INTO target [VALUES]
   ...
   [ELSE] INTO target [VALUES]
SELECT ...
FROM   source_query;

您可能需要重組源子查詢以創建一列,該列指示每個文件夾名稱的第一行,然后可以在when條件下將每個文件夾的每一行僅插入到文件夾表中,然后將所有行插入到鏈接表中。 您還必須重新設置如何生成ID,以便每個鏈接行都具有相同的folderID。 換句話說,您學習集合函數的時間!

示例:查看此查詢,看看它是否可以幫助您解決(提示,folder_rank可以成為folder_id的基礎,以及group_rank如何驅動when子句來確定文件夾插入)

select dense_rank() over (order by foldername) as folder_rank,
       rank() over (parition by foldername order  by url) as group_rank
     , foldername
     , seq_link_id.nextval
     , url 
from folder, link 
where folder.folderid = link.folderid

或者,看一下在pl / sql而不是純SQL中執行此操作:

declare
  l_new_folder_id new_folder.folder_id%type;
begin
   for folder_Rec in (select folder_id, foldername from folder)
   loop
      insert into new_folder (folder_id, folder_name) 
      values ( seq_folder_id.nextval, folder_Rec.folder_name) 
      returning folder_id into l_new_folder_id;

      for link_rec in (select url from link where folder_id = folder_rec.folder_id)
          insert into new_link (link_id, folder_id, url) 
          values (seq_link_id.nextval, l_new_folder_id, link_rec.url);
      end loop;
    end loop;
    commit;
end;

有幾種方法可以使這只貓變皮,對於初學者來說,復雜的SQL可能不是最佳選擇。 另外,檢查您的源數據-如果您的文件夾沒有任何鏈接,那么如果要插入無鏈接文件夾,則純SQL方法也必須合並外部聯接,而不是當前定義。 PL / Sql解決方案已經可以解決這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM