sql - 用于选择记录以仅包含特定 ID 的本机查询
问题描述
我正在我的应用程序中实施高级搜索。我对 Oracle 和 JPA 有点陌生。数据库结构与包含 StudentID 和 CourseID 的中间表具有多对多关系 ( ERD )。
我正在尝试返回具有课程/课程列表的学生行。
基本上,我想要的结果
SELECT DISTINCT s.* FROM STUDENT s
INNER JOIN STUDENT_COURSE sc ON s.StudentID = sc.StudentID
INNER JOIN COURSE c ON c.CourseID = sc.CourseID
WHERE ( c.CourseID IN (SELECT DISTINCT CourseID FROM STUDENT_COURSE WHERE CourseID = 'A01') AND c.CourseID IN (SELECT DISTINCT CourseID FROM STUDENT_COURSE WHERE CourseID = 'A02'));
它返回同时拥有课程“A01”和“A02”的学生的记录。
ID | 年龄 | 年级 |
---|---|---|
1 | ... | ... |
4 | ... | …… |
9 | ... | …… |
有课程
培训班 |
---|
A01,A02 |
A01,A02,A03,X02 |
A01、A02、A03 |
目标是使用 Spring Data JPA 获得类似的结果。并使选择任意数量的课程 ID 更加通用。
我试过了
@Query(value="SELECT DISTINCT s.* FROM STUDENT s "
+"INNER JOIN STUDENT_COURSE sc ON s.StudentID = sc.StudentID "
+"INNER JOIN COURSE c ON c.CourseID = sc.CourseID "
+"WHERE ( s.STUDENTID IN (SELECT DISTINCT STUDENTID FROM STUDENT_COURSE WHERE CourseID =:courseIds)",nativeQuery=true))
public List<Student> advancedSearch(@Param("courseIds") String courseIds);
例如, courseIds 字段包含“A01,A02”。结果将是空的。
我查看了人们使用IN的示例。当我尝试它时,它会返回学生有课程 AO1 OR A02 OR Both 的记录。
不想要这个
ID | 年龄 | 年级 |
---|---|---|
2 | ... | ... |
3 | ... | …… |
8 | ... | …… |
有课程
课程编号 |
---|
A01,A03 |
A01, X01 |
A02 |
我想要同时具有 A01和A02 的学生记录,如另一表所示。
解决方案
我的猜测是你想要的查询是
select s.name /* note this column doesn't appear in your ERD */
,s.age
,s.grade
from student s
join student_course sc
on s.studentID = sc.studentID
where sc.courseID IN ('A01', 'A02')
group by s.name /* again, this column isn't in your ERD */
,s.age
,s.grade
having count(sc.courseID) = 2
这不会产生你说你想要的输出表。但是您发布的查询也没有。这将返回所有参加过这两门课程的学生(如果要更改数据模型以允许学生多次参加课程,您可以distinct
在子句中添加一个)。having
它不会以逗号分隔列表的形式为您提供学生已参加的所有课程的列表。但是您发布的查询也不会返回任何课程信息。
如果这不是您想要的,那么更新您的问题会非常有帮助
- 您的模式的 DDL 以文本形式(因此我们可以运行它)而不是图像
- 插入您想要的任何样本数据的 DML
- 您希望查询返回的实际结果(因为您发布的查询返回的内容、您说您想要的数据表以及您尝试完成的描述性文本之间存在冲突,因此令人困惑尝试找出哪个是正确的)。
推荐阅读
- php - Imagekit 不返回转换后的 url
- python - 如何使用动态生成的表单管理 Django 表单验证
- powershell - 使用其他联系人的属性更新 Powershell 中的 Outlook 联系人属性会用空字符串覆盖
- html - 如何使用 css 和 html 为输入元素正确设置文本溢出省略号?
- python - groupby 级别滚动和在 lambda 函数中进行滚动之间的区别
- c# - 如何将我的 dll 与 conf 文件连接起来
- css - 在样式化组件中将框放在圆圈内
- kotlin - Kotlin 协程:如何 flatMapConcat 3 流,如果其中一个尚未开始发射?
- reactjs - React 中子组件的错误边界
- reactjs - 未捕获的类型错误:无法读取未定义的属性(读取“源”)