复制两个相关表中的选择

时间:2014-04-12 15:43:13

标签: sql sqlite

我在数据库中有两个表。在第一个表(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字段都具有相同值的集合组成。我希望使用新的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,因此我可以简单地为set = 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)

但是如果set不包含tab1中的顺序id,则这不起作用。我可以对原始ID进行完整查询,然后为集合37的新插入的id创建1:1映射,然后添加每行之间的差异,然后在表中插入新计算的行。但这需要将所有选择加载到客户端并在客户端上完成所有工作。有没有办法在一般情况下创建一个在服务器上执行此操作的查询?

1 个答案:

答案 0 :(得分: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)