mysql - 将 2 个查询合并为一个查询,作为子查询

标签 mysql sql sql-server-2008-r2

我的第一个查询从 3 个表中提取学生详细信息。学生、StudentAddress 和 StudentNote。

我的查询必须列出学生的详细信息,包括 ID、姓名、地址、备注并找到他们注册类(class)的最早日期。

我已经创建了一个聚合查询来执行此操作。

SELECT STU_Name, MIN(ENR_StartDate)
FROM Student
INNER JOIN Enrolment
ON Student.STU_Student_ID = Enrolment.ENR_Student_ID
GROUP BY STU_Name

这是我的主要查询,它提取了学生的详细信息。

SELECT STU_Name, ADD_Addr_Line_1, ADD_Addr_Line_2, ADD_Addr_Line_3, ADD_Postcode, NTE_Note, ENR_StartDate
FROM Student
INNER JOIN StudentAddress
ON Student.STU_Student_ID = StudentAddress.ADD_Student_ID
INNER JOIN StudentNote
ON Student.STU_Student_ID = StudentNote.NTE_Student_ID
INNER JOIN Enrolment
ON Student.STU_Student_ID = Enrolment.ENR_Student_ID

我想链接这些查询,以便结果集告诉我行中每个学生的最早开始日期。

学生期望的输出

row0: student1id, student1name, student1address, student1note1, student1startdate

row1: student1id, student1name, student1address, student1note2, student1startdate

这将允许一个学生有多个笔记,但是对于一个学生,开始的开始总是被计算为相同的。

我已经在 sql fiddle 中构建了一个测试模式。

http://sqlfiddle.com/#!2/cecea/4

感谢您的帮助。

最佳答案

请注意,您没有为其中一名学生添加注释。这已通过外部联接得到纠正。

在另一种情况下,您有 2 个笔记给一个学生。因此该学生在结果中有两行。

要解决这个问题,您需要选择一个特定的音符(第一个、最后一个等)。您可以使用与查找每个学生的第一个注册记录相同的逻辑来做到这一点。

经过调整以处理学生在同一注册日期可能有不止一行的情况。这种方法可用于打破大多数这些类型的关系。请注意,窗口函数通常是更好的方法,但 MySQL 不支持它们。

SELECT STU_Name
     , ADD_Addr_Line_1
     , ADD_Addr_Line_2
     , ADD_Addr_Line_3
     , ADD_Postcode
     , NTE_Note
     , Enrolment.ENR_StartDate
     , Enrolment.ENR_ID
     , Student.STU_Student_ID
     , StudentAddress.ADD_ID
     , StudentNote.NTE_ID
  FROM Student
  JOIN StudentAddress
    ON Student.STU_Student_ID = StudentAddress.ADD_Student_ID
  LEFT JOIN StudentNote
    ON Student.STU_Student_ID = StudentNote.NTE_Student_ID
  JOIN Enrolment
    ON Student.STU_Student_ID = Enrolment.ENR_Student_ID
  LEFT JOIN Enrolment AS e2
    ON Enrolment.ENR_Student_ID = e2.ENR_Student_ID
   AND (Enrolment.ENR_StartDate, Enrolment.ENR_ID) > (e2.ENR_StartDate, e2.ENR_ID)
 WHERE e2.ENR_StartDate IS NULL
;

关于mysql - 将 2 个查询合并为一个查询,作为子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12849566/

相关文章:

sql - 从 GROUP BY 操作中选择最大计数

php - 如何处理跨不同设备的 session ?

mysql - SQL在查询多个表时组合来自同一个表的多个列

sql - 从 SQL Server 数据库生成 DDL 脚本

sql - 在 SQL Server 2005 中使用 SSIS 从平面文件导入时如何保留 NULL 值

sql-server - sql server 2008 R2 远程过程调用失败

sql-server - 您如何确保新索引不会减慢查询速度?

mysql - ubuntu 服务器 10.4 中缺少/tmp/mysql.socket 文件

mysql - 具有不同模式和表结构的新升级应用程序中mysql的数据迁移工具

MySQL innodb 外键