我有三个表,并希望:
[Select
所有学生from
第一张表,
与第二个表中的'999'区的学校至少有一个联系
[and
至少与社交号码为'101'的老师建立了联系]
and
至少是第三张表中编号为'103'的老师。
这些表通过第二个表连接。
我创建了一个在线sql编译器来显示问题:http://tpcg.io/FIoO79xi
此查询工作正常且符合预期,直到我在搜索与教师'103'的连接的位置添加第三个EXISTS
命令为止。然后它不再返回学生A,尽管他与老师'103'有联系[]
我通过在joins
中添加Exists sub-query
找到了解决方法:http://tpcg.io/0sza7t5g但是由于我的实际数据库表具有数百万个条目,因此这会导致sub-query
所经过的每一行都连接三个表,并且如果只在表的末尾找到合适的条目,这可能会花费很长时间。
我认为问题出在sub-query
:WHERE th1.school_id = th.school_id
,在这里我试图找到从第三位表老师到开始时连接在一起的表的连接。如果我搜索到与教师102而不是103的连接,则查询有效并返回学生A:http://tpcg.io/2tHIEk3V因为老师101和102具有相同的school_id。
但是当我搜索与老师101和103的连接时,如何写不同的字,以便查询也找到学生A?学生A与这两者都有联系,因此存在应该有可能...
添加:我不能使用三个单独的查询,然后对它们使用Intersect
命令,因为我正在将SQL
转换为JPA
查询。 JPA
不知道相交...
我有三个表,并希望:从第一个表中选择所有与第二个表中的'999'区的学校至少有一个连接,并且与...至少有一个连接的学生。 [
`SELECT name
FROM student
LEFT JOIN school sc1 on student.student_id = sc1.student_id
LEFT JOIN teacher th1 on sc1.school_id = th1.school_id
WHERE sc1.district = '999'
AND th1.social_number in('101','103')`
不做把戏吗?
SELECT name
FROM student
left JOIN school sc1 on #student.student_id = sc1.student_id
left JOIN teacher th1 on sc1.school_id = th1.school_id and th1.social_number=101
left JOIN teacher th2 on sc1.school_id = th2.school_id and th1.social_number=103
where sc1.district=999
第一个条件:至少第二个连接到'999'区的学校表格需要
student
与school
的连接。第二和第三条件:至少与社交号码为101的老师的联系至少一位老师的电话号码是'103'需要2
单独
将student
连接到school
和teacher
:SELECT s.name FROM student s INNER JOIN school sc on s.student_id = sc.student_id AND sc.district = 999 INNER JOIN school sc1 on s.student_id = sc1.student_id INNER JOIN teacher t1 on t1.school_id = sc1.school_id AND t1.social_number = 101 INNER JOIN school sc2 on s.student_id = sc2.student_id INNER JOIN teacher t2 on t2.school_id = sc2.school_id AND t2.social_number = 103
请注意,social_number in (101, 103)
之类的条件将不起作用,因为即使仅满足其中一个条件,它也会返回结果。这就是为什么需要2个联接到school
和teacher
的原因。另外,所有联接都必须为inner
,因为您要满足所有3个条件。参见demo。结果:
| name | | ---- | | A |
SELECT name
FROM student
left JOIN school sc1 on #student.student_id = sc1.student_id
left JOIN teacher th1 on sc1.school_id = th1.school_id and th1.social_number=101
left JOIN teacher th2 on sc1.school_id = th2.school_id and th1.social_number=103
where sc1.district=999
至少第二个连接到'999'区的学校表格