假设我有两个表A{int m}
和B{int m}
,我必须使用关系代数在两个表中找到最大 m ,但我不能使用max函数。我该怎么办?它?我认为使用join我们可以做到,但我不确定我的猜测是否正确。
注意:这是一个面试问题。
答案 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)
那么:如何仅使用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语法,以避免与希腊字母混淆。]