表格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);
但它没有用。请帮我解决一下这个。谢谢!
答案 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),那么他们将处于最终结果中。
这是仅使用没有聚合的关系代数运算符获得的:)