首页 > 解决方案 > 用于选择记录以仅包含特定 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

我想要同时具有 A01A02 的学生记录,如另一表所示。

标签: sqlspringoraclejpaspring-data-jpa

解决方案


我的猜测是你想要的查询是

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
  • 您希望查询返回的实际结果(因为您发布的查询返回的内容、您说您想要的数据表以及您尝试完成的描述性文本之间存在冲突,因此令人困惑尝试找出哪个是正确的)。

推荐阅读