【发布时间】:2015-09-15 08:55:35
【问题描述】:
我有 3 张桌子:
CREATE TABLE public.student (id serial NOT NULL PRIMARY KEY,"student" varchar(30) NOT NULL) WITH (OIDS = FALSE);
CREATE TABLE public."class" (id serial NOT NULL PRIMARY KEY,"class" varchar(30) NOT NULL) WITH (OIDS = FALSE);
CREATE TABLE public.student_class (student_id integer, class_id integer, /* Keys */ CONSTRAINT student_class_index01
PRIMARY KEY (student_id, class_id)) WITH (OIDS = FALSE);
使用这些值:
INSERT INTO public.student_class ("student_id","class_id") VALUES(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(2,1),(2,2),(2,3),(3,4),(3,5),(3,6),(3,7),(3,8);
我现在想知道至少有一门与另一门重合的学生的姓名:
学生 1 与 2 和 3 至少有一次重合。学生 2 有 与 1 至少有一个巧合。学生 3 至少有一个巧合 与 1 重合。
我试过这个,但不是学生做的。
SELECT distinct a.id,a.student from public.student a
LEFT OUTER JOIN public.student_class b ON b.student_id=a.id
LEFT OUTER JOIN public.class d ON d.id=b.class_id
WHERE class_id IN(select class_id from student_class where student_id not in(1))
AND a.id not in(1);
我认为 taht 比我想象的要容易。谢谢。
【问题讨论】:
-
所以你想要的是一个学生列表,在student_class中存在一条记录,在student_class中也存在另一条具有相同class_id但不同student_id的记录。所以嵌套的存在子句应该这样做。
-
顺便说一句,您可能希望去掉表名和列名周围的双引号。糟糕的实践,这使得编写代码变得更加困难。
-
另外,当您的结果集需要一个不同的,您应该始终考虑您的查询结构是否正确。在这种情况下,您应该能够编写查询而不需要 distinct。
-
是的,你是对的。谢谢你的提示
标签: postgresql select join