如果不在列表中,则插入新行并删除旧行。

时间:2014-12-11 16:56:32

标签: sql sqlite

我正在尝试建模两个表TableA和TableB之间的关系。 关系在它们自己的表RelationTable中列出,列为:ID,tableA_ID,tableB_ID。

为了确保TableA_ID和TableB_ID的每个组合都是唯一的,我添加了一个" unique(tableA_ID,tableB_ID)"在"创建表"言。

此外,RelationTable中的每一行都可以属于一个组(在具有列ID和groupName的GroupTable中)。

现在我想更新我的RelationTable。我有一个TableA和TableB的匹配rowID的更新列表。我也知道这些对所属的群体。

我可以插入新行,如果行存在则忽略插入。

insert or ignore into RelationTable (tableB_ID,tableB_ID) values (:a,:b)

然后我获取insertedRowID并将其添加到GroupTable。 (尽管也许这两个步骤可以一步完成,并且批量更新?)

但是如何删除RelationTable(和GroupTable)中不再有效的行?无效行是其(tableA_ID,tableB_ID)对不在更新/(或活动关系)列表中但在GroupTable中列出的行。

我坚持这个说法。它没有考虑groupTable,我必须结合每一对值。对于少数对来说这可能是好的,但是对于更大数量的对来说它变得笨拙。这是前进的方向吗?

delete from RelationTable where ID not in 
  (select RelationTable from RelationTable inner join 
    (select "aValue"      as a, "aValue2" as b union all 
     select "anotherValue as a, "anotherValue2" as b
    ) as pair 
   on pair.a = RelationTable.tableA_ID and 
      pair.b = RelationTable.tableB_ID
   )

Inspiration for the last statement

0 个答案:

没有答案