没有聚合函数的关系代数

时间:2015-10-13 07:01:31

标签: sql relational-database aggregate-functions relational-algebra

表格WORKING包含学生和项目的名称。

值为:

(s1,p2)
(s1,p3)
(s1,p4)
(s2,p3)
(s2,p4)
(s3,p1)
(s4,p1)
(s3,p2)
(s4,p2)
(s5,p3)
(s5,p4)
(s6,p3)

我必须找到一对在至少两个不同项目中工作的学生。

我尝试了这个查询。

select w1.student, w2.student
from working w1,
     working w2
where w1.project != w2.project
  and w1.student != w2.student 
except (select w1.student, w2.student
        from working w1,
             working w2 
        where w1.project = w2.project
          and w1.student != w2.student);

但它没有用。请帮我解决一下这个。谢谢!

1 个答案:

答案 0 :(得分:0)

试试这个:

SELECT distinct R1.st1, R1.st2
FROM
    (SELECT w1.student st1, w2.student st2, w1.project pr
     FROM working w1, working w2
     WHERE w1.project = w2.project
     AND w1.student < w2.student) as R1,
    (SELECT w1.student st1, w2.student st2, w1.project pr
     FROM working w1, working w2
     WHERE w1.project = w2.project
     AND w1.student < w2.student) as R2
WHERE R1.st1 = R2.st1
AND R1.st2 = R2.st2
AND R1.pr <> R2.pr;

基本上,这里有两个相同的子查询R1,R2。每个子查询列出了所有曾与他们合作过的项目一起工作过的学生对,每个项目有一行,所以它会有:

s1, s2, p3
s1, s2, p4
s1, s3, p2
s1, s4, p2
s1, s5, p3
s1, s5, p4
s1, s6, p3
s2, s5, p3
s2, s5, p4
s2, s6, p3
s3, s4, p1
s3, s4, p2
s5, s6, p3

因此,R1的结果是此列表,R2的结果是相同的列表。主查询加入这两个列表,使学生相同,项目不同。因此,如果两个学生只在一个项目上合作(例如s1和s3),它就不会加入任何项目。如果他们处理多个项目(例如s1和s2),那么他们将处于最终结果中。

这是仅使用没有聚合的关系代数运算符获得的:)