在关系代数中不使用max函数查找两个表中的最大值

时间:2014-02-18 08:22:45

标签: database max relational-algebra

假设我有两个表A{int m}B{int m},我必须使用关系代数在两个表中找到最大 m ,但我不能使用max函数。我该怎么办?它?我认为使用join我们可以做到,但我不确定我的猜测是否正确。

注意:这是一个面试问题。

2 个答案:

答案 0 :(得分:0)

SELECT M FROM (SELECT M FROM A UNION SELECT M FROM B) ORDER BY M DESC LIMIT 1

这不使用MAX,只使用简单的vanilla SQL。

答案 1 :(得分:0)

嗯,我很疑惑为什么这个问题涉及两张桌子。对于问题的问题,我只是UNION这两个(就像StilesCrisis所做的那样),然后求解一个表。

那么:如何仅使用NatJOIN找到表中的最大m?这是在包含层次结构的表上查找顶部节点的简化版本(想想汇编/组件爆炸或组织结构图)。

关键的想法是我们需要将表“复制”为具有不同属性名称的内容,以便我们可以成对地比较元组。 (因此,这将使用简化形式的NatJOIN又名交叉产品)。请参阅此处示例How can I find MAX with relational algebra?

A NOT MATCHING
((A x (A RENAME m AS mm)) WHERE m < mm)

subtrahend是所有元组,m比其他元组少。反连接是除了那些之外的所有元组 - 即MAX。 (使用NOT MATCHING我认为比MINUS更容易理解,并且不需要关系与UNION兼容。它大致相当于SQL NOT EXISTS。)

[我使用了Tutorial D语法,以避免与希腊字母混淆。]