我需要一位SQL专家:对内部联接的EXISTS查询返回错误结果

问题描述 投票:-1回答:3

我有三个表,并希望:

[Select所有学生from第一张表,

与第二个表中的'999'区的学校至少有一个联系

[and至少与社交号码为'101'的老师建立了联系]

and至少是第三张表中编号为'103'的老师。

这些表通过第二个表连接。

my three tables

我创建了一个在线sql编译器来显示问题:http://tpcg.io/FIoO79xi

此查询工作正常且符合预期,直到我在搜索与教师'103'的连接的位置添加第三个EXISTS命令为止。然后它不再返回学生A,尽管他与老师'103'有联系[]

我通过在joins中添加Exists sub-query找到了解决方法:http://tpcg.io/0sza7t5g但是由于我的实际数据库表具有数百万个条目,因此这会导致sub-query所经过的每一行都连接三个表,并且如果只在表的末尾找到合适的条目,这可能会花费很长时间。

我认为问题出在sub-queryWHERE 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')`

不做把戏吗?

您需要2个教师表加入

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'区的学校表格

需要studentschool的连接。第二和第三条件:

至少与社交号码为101的老师的联系至少一位老师的电话号码是'103'

需要2

单独

student连接到schoolteacherSELECT 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个联接到schoolteacher的原因。另外,所有联接都必须为inner,因为您要满足所有3个条件。参见demo。结果:

| name | | ---- | | A |

sql jpa subquery exists
3个回答
0
投票
为什么这么复杂?

0
投票
您需要2个教师表加入

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


0
投票
第一个条件:

至少第二个连接到'999'区的学校表格
© www.soinside.com 2019 - 2024. All rights reserved.