2014-04-12 21 views
0

我在數據庫中有兩個表。在第一個表格(tab1)中,我有一個項目列表。在第二張表中,我有這些項目之間的多對多關係。複製兩個相關表中的選擇

CREATE TABLE tab1(id INTEGER PRIMARY KEY ASC,set INTEGER, name TEXT); 
CREATE TABLE tab2(id INTEGER PRIMARY KEY ASC,id1 INTEGER,id2 INTEGER,relationship TEXT); 

在第一個表中的項目由集,都爲set字段的值相同。我想用新的集合ID複製任何給定集合,使得新集合包含原始集合的相同元素和關係。如果集合中的所有項目都有順序ID,我可以按如下方式進行操作。首先,找到集合中最高的ID(在這種情況下,集合3):

SELECT id FROM tab1 WHERE set=3 ORDER BY id DESC LIMIT 1 

我將它分配給變量$ oldid。接下來,我重複項TAB1匹配指定的一組,給他們一個新的集(在這種情況下37)

INSERT INTO tab1 (set,name) SELECT 37, name FROM tab1 WHERE set=3 ORDER BY id ASC 

我再拿到插入的最後一行的id,並將其分配給變量$ NEWID :

SELECT last_insert_rowid() 

然後我分配$ diff = $ newid- $ oldid。由於原集有順序ID,我可以簡單地選擇原來的關係爲集= 3,然後加入不同:

INSERT INTO tab2 (id2,id2,relationship) SELECT id1+$diff,id2+$diff,type FROM tab WHERE id1 IN (SELECT id FROM tab WHERE set=3) 

但是,如果設置不TAB1由連續的id這是行不通的。我可以對原始ID進行完整查詢,然後創建一個1:1映射到新插入的集合37的ID,然後添加每行之間的差異,然後將新計算的行插入表中。但是這需要將所有選擇加載到客戶端並完成客戶端上的所有工作。有一種方法可以在一般情況下創建一個在服務器上執行的查詢嗎?

回答

1

假設(set, name)tab1候選鍵,您可以使用這些列來查找相應的值:

INSERT INTO tab2(id1, id2, relationship) 
SELECT (SELECT id 
     FROM tab1 
     WHERE "set" = 37 
      AND name = (SELECT name 
         FROM tab1 
         WHERE id = tab2.id1)), 
     (SELECT id 
     FROM tab1 
     WHERE "set" = 37 
      AND name = (SELECT name 
         FROM tab1 
         WHERE id = tab2.id2)), 
     relationship 
FROM tab2 
WHERE id1 IN (SELECT id 
       FROM tab1 
       WHERE "set" = 3) 
    OR id2 IN (SELECT id 
       FROM tab1 
       WHERE "set" = 3) 
+0

看起來這可以做到這一點。 id1列看起來不錯,但id2列似乎是原始ID,而不是重複的ID。我嘗試用'(SELECT id FROM tab1 WHERE set = 37 AND name =(SELECT name FROM tab1 WHERE id = tab2.id2))替換'id2'作爲id2',這似乎工作。 – Michael