Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql “关系代数”;分组“;_Sql_Relational Algebra - Fatal编程技术网

Sql “关系代数”;分组“;

Sql “关系代数”;分组“;,sql,relational-algebra,Sql,Relational Algebra,对不起,这个模糊的问题主题 我遇到了一个特殊的关系代数问题,这让我和几个朋友感到困惑 现在,问题是: For each department, find the maximum salary of instructors in that department. You may assume that every department has at least one instructor. 我还将上传该模式,以及一个可视助手 我已经在一定程度上解决了这个问题 我需要一个关系,包括任何部门的所有

对不起,这个模糊的问题主题

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

现在,问题是:

For each department, find the maximum salary of instructors in that
department. You may assume that every department has at least one
instructor.
我还将上传该模式,以及一个可视助手

我已经在一定程度上解决了这个问题

我需要一个关系,包括任何部门的所有教员,我们已经得到了。这是
讲师
关系

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

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

π(max(salary)(σ(dept_name = x(instructor)))
其中x=我要找的任何部门名称,但如果我这样做,那么我必须为每个部门建立新的关系

你会怎么做


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

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

dept_name_G_{max(salary)}(
    σ_{ddept_name = idept_name}(
        ρ_{dept_name/ddept_name}(department) ⨯
        ρ_{dept_name/idept_name}(instructor)
    )
)
这就是你想要的

请记住,所有投影都只是集合上的操作。你要做的第一件事 将
部门
的信息连接起来,
讲师
将信息整合在一起。 所以你想加入
部门
讲师
,基本上是一个交叉产品(
):

因此,您现在需要的是过滤元组,其中讲师的
dept\u name
等于
部门\部门名称
。但是你也注意到你现在有一个命名冲突, 即,
dept\u name
列出现两次

因为你不能简单地做
σ{dept\u name=dept\u name}(department⨯ 讲师)
您需要在 至少有一个
dept\u 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$)
}
整个过程是一个简单的过程,可以用以下几点表达:

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

导致

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

这很好!它回答了我的问题,澄清了我对交叉积和自然连接的混淆。主要的道具@YourbrainonCompSci&nemo Natural join仅为每个输入列名返回一列。要获得在交叉联接之前重命名了两个dept列的自然联接,必须突出其中一个列,并在限制后重新命名另一个列。(答案顶部的版本中缺少该重命名。)或者要获得自然连接,只需重命名一个表dept并在限制后将其投影出去。@YourbrainonCompSci&nemo,除了传统关系代数中没有MAX或GROUP之外。这本质上是SQL,而不是任何典型的关系代数。尽管一些可以用它们表达的查询仍然可以不用它们来表达。就像问题中的那个。如果你不被允许使用它们,那么作业就难多了。我想知道代数应该用什么。(有很多。)
{dept_name}_G_{max(salary)}(department ⋈ instructor)
{
 (depA, 10$), 
 (depB, 20$)
}