2016-04-20 73 views
0

我试图在从一个表中拉出最大日期时连接两个表。 我有一张学生桌和一张通讯桌。每个学生在学生表中都是独一无二的,并且有许多通讯条目。Microsoft SQL Server:连接两个表的最大日期

我想创建一个SQL脚本,用于获取每个学生的ID,姓名,最新通信日期以及该日期的通信消息。

我能够使用max(comm_date)group by为每个学生拉最新日期,但是当拉动相应的通信消息时,事情会变得很混乱(很多重复)。

表:学生

studentid, name 

表:通信

​​

结果:

student.studentid, student.name, communications.comm_date, communications.comm_msg 

我怎么能拉定相应的通信信息?

+0

通过“Microsoft SQL”,你的意思是** SQL Server **(如果是这样,请添加一个'sql-server'标签),或者你的意思是“Microsoft Access中的SQL”(如果是这样,请添加一个'ms-access'标签) –

+1

明白了,谢谢marc_s。 – aksum

回答

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()并重新加入多次,就像这样做。

+0

谢谢DRapp,钉上它! – aksum

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