连接JOINS或写入递归函数 - 动态JOIN查询数的问题

时间:2010-01-15 18:28:48

标签: mysql join recursion

我有以下问题需要解决:

假设有一个表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我宁愿编写一个递归函数,只选择下一步的成员,然后让函数调用自己直到我得到最终结果?

或者还有其他更好的方式来做这样的事情吗?

1 个答案:

答案 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字段,即可添加或删除条目的修订版。