2016-04-20 74 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