【问题标题】:Relational algebra "grouping"关系代数“分组”
【发布时间】:2014-02-05 03:07:54
【问题描述】:

抱歉,问题主题含糊!

我遇到了一个特殊的关系代数问题,让我和几个朋友感到困惑。

现在,问题来了:

For each department, find the maximum salary of instructors in that
department. You may assume that every department has at least one
instructor.

我也会上传架构,作为视觉助手。

我已经解决了这个问题;

我需要一个包含任何部门的所有教师的关系,我们已经做到了。这是instructor 关系。

出于这种关系,我需要将其“拆分”为每个部门的基础。一旦我有了这种关系,我只需使用max(salary) 并返回它。

问题是,我能想到的唯一方法是这样的:

π(max(salary)(σ(dept_name = x(instructor)))

其中 x = 我正在寻找的任何部门名称,但如果我这样做,那么我必须为每个部门建立一个新关系!

你会怎么做?

(注意:如果您想在答案中使用它们,我只是从维基百科复制并粘贴符号)

【问题讨论】:

    标签: sql relational-algebra


    【解决方案1】:

    我的关系代数可能有点生疏,但我认为

    dept_name_G_{max(salary)}(
        σ_{ddept_name = idept_name}(
            ρ_{dept_name/ddept_name}(department) ⨯
            ρ_{dept_name/idept_name}(instructor)
        )
    )
    

    是你所寻求的。

    请记住,所有投影都只是对集合的操作。你要做的第一件事 连接department 和instructor 的信息是把信息放在一起。 所以你想加入department和instructor,基本上是一个叉积(⨯):

    department = {(depA, 100$), (depB, 200$)}
    instructor = {(will, depA, 10$), (bob, depB, 20$), (will, depB, 9$)}
    department ⨯ instructor = {
                                (depA, 100$, will, depA, 10$), 
                                (depA, 100$, bob, depB, 20$), 
                                ..., 
                                (depB, 200$, will, depA, 10$), 
                                ...
                              }
    

    所以你现在想要的是过滤教师的dept_name 等于 部门的dept_name。但是你也注意到你现在有一个命名冲突, 即dept_name 列出现两次。

    因为你不能简单地做σ_{dept_name = dept_name}(department ⨯ instructor),你需要重命名为 dept_name 字段中的至少一个。为了清楚起见,我将两者都重命名了。

    所以你现在拥有的是

    σ_{ddept_name = idept_name}(
        ρ_{dept_name/ddept_name}(department) ⨯
        ρ_{dept_name/idept_name}(instructor)
    )
    

    给你:

    {
     (depA, 100$, will, depA, 10$), 
     (depB, 200$, bob, depB, 20$),
     (depB, 200$, will, depB, 9$)
    }
    

    整个过程是一个natural join,可以简写成:

    department ⋈ instructor
    

    现在最后一步是预测每个部门的最高工资。一个简单的投影不能做到这一点 但aggregation operator 可以:

    {dept_name}_G_{max(salary)}(department ⋈ instructor)
    

    结果

    {
     (depA, 10$), 
     (depB, 20$)
    }
    

    【讨论】:

    • 这个不错!它回答了我的问题并消除了我在交叉产品和自然连接之间的困惑。主要道具!
    • @YourbrainonCompSci & nemo 自然连接只为每个输入列名返回一列。要获得在交叉连接之前重命名两个部门列的自然连接,您必须投影出一个并在限制之后重命名另一个。 (并且答案顶部的版本中缺少该重命名。)或者要获得自然连接,只需重命名一个表部门并在限制后将其投影出来。
    • @YourbrainonCompSci & nemo 除了传统关系代数中没有 MAX 或 GROUP。这本质上是 SQL,而不是任何典型的关系代数。尽管一些可以用它们表达的查询仍然可以在没有它们的情况下表达。就像问题中的那个。如果您不被允许使用它们,则分配会更加困难。我想知道应该使用什么代数。 (有很多。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2013-08-21
    • 2017-09-08
    相关资源
    最近更新 更多