我有以下问题需要解决:
假设有一个表A包含许多元素,这个表被复制成表B.在表B中,一些原始元素丢失,一些被添加。参考表AB跟踪这些变化。然后将表B复制为表C,并再次丢失一些现有元素并添加一些元素。另一参考表BC记录了这些关系。 ......等等。
有n个这样的表,其中有n-1个参考表。
如果我想知道我在C表中选择的哪些元素已经存在于A中,我可以通过以下操作来实现:
SELECT AB.oldID
FROM AB
JOIN BC
WHERE BC.newID IN (x, y, z)
由于引用表的数量可以保持警惕,因此JOIN行的数量可以保持警惕。
我是否应该通过循环遍历步骤并添加JOIN行来连接查询或者shoudl我宁愿编写一个递归函数,只选择下一步的成员,然后让函数调用自己直到我得到最终结果?
或者还有其他更好的方式来做这样的事情吗?
答案 0 :(得分:1)
由于您的表名不同,您需要构建某种动态查询。
如果执行递归函数方法,则需要以某种方式在函数调用之间传递结果集。
MySQL
没有数组数据类型,并且将结果存储在临时表中太长了。
结论:使用连接。
<强>更新强>
以下是一个示例查询,它返回通过修订版A
保留到修订版M
的条目(使用一个表格设计):
SELECT *
FROM entries e
WHERE NOT EXISTS
(
SELECT *
FROM revisions r
JOIN revision_changes rc
ON rc.revision_id = r.id
WHERE rc.entry_id = e.id
AND rc.deleted
AND r.revision_id BETWEEN 'A' AND 'M'
)
这样,您只需填写added
的{{1}}和deleted
字段,即可添加或删除条目的修订版。