我正在尝试连接两个表,同时从一个表中提取最大日期。 我有一张学生桌和一张交流桌。每个学生在学生表中都是独一无二的,并且有很多交流条目。
我想创建一个SQL脚本,用于提取每个学生的ID,姓名,最新通信日期以及该日期的通信消息。
我可以使用max(comm_date)
和group by
为每个学生提取最新日期,但在提取相应的通信消息时,事情会变得混乱(许多重复)。
表:学生
studentid, name
表:通讯
studentid, comm_date, comm_msg
结果:
student.studentid, student.name, communications.comm_date, communications.comm_msg
如何提取max(comm_date)
给出的相应通讯讯息?
答案 0 :(得分:1)
这应该可以满足您的需求。我不知道通过嵌套子查询是否有性能影响,但我喜欢这种干净的语法:
SELECT
s.studentid,
s.name,
LastCommDate = MAX(c.comm_date),
LastCommMessage = (SELECT comm_msg FROM Communications WHERE studentid = s.studentid AND comm_date = MAX(c.comm_date))
FROM Student AS s
INNER JOIN Communications AS c
ON s.studentid = c.studentid
GROUP BY s.studentid, s.name
答案 1 :(得分:0)
这应该得到你所需要的......
select
s.studentid,
s.name,
c2.comm_date,
c2.comm_msg
from
Student s
LEFT JOIN
( select
c1.studentid,
max( c1.comm_Date ) as MaxDate
from
Communications c1
group by
c1.studentid ) PreMax
on s.studentid = PreMax.StudentID
LEFT JOIN Communications c2
on PreMax.StudentID = c2.StudentID
AND PreMax.MaxDate = c2.comm_Dat
此外,我建议在学生表中添加一列用于最近的通信日期(如果通信具有自动增量列,例如同一天的多个条目,则建议添加一个ID)。然后,通过插入触发器到通信表,您使用最新的日期(或通信ID)更新学生表。然后你永远不需要继续重新查询MAX()并重新连接多次,就像这一样。