我在数据库中有两个表。在第一个表(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映射,然后添加每行之间的差异,然后在表中插入新计算的行。但这需要将所有选择加载到客户端并在客户端上完成所有工作。有没有办法在一般情况下创建一个在服务器上执行此操作的查询?
答案 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)