2016-04-20 10 views
0

Ich versuche, zwei Tabellen zu verbinden, während das maximale Datum von einem gezogen wird. Ich habe einen Schülertisch und eine Kommunikationstabelle. Jeder Schüler ist einzigartig in der Schüler-Tabelle und hat viele Kommunikationseinträge.Microsoft SQL Server: Maximales Datum, das zwei Tabellen verbindet

Ich möchte ein SQL-Skript erstellen, das die ID jedes Schülers, den Namen, das letzte Kommunikationsdatum und die Kommunikationsnachricht für dieses Datum abruft.

Ich bin in der Lage, das letzte Datum für jeden Schüler mit max(comm_date) und group by zu ziehen, aber die Dinge werden unordentlich (viele Duplikationen) beim Ziehen der entsprechenden Kommunikation Nachricht.

Tabelle: Studenten

studentid, name 

Tabelle: Kommunikation

studentid, comm_date, comm_msg 

Ergebnis:

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

Wie kann ich die entsprechenden Kommunikationsnachricht gegebenziehen?

+0

Mit "Microsoft SQL" meinen Sie ** SQL Server ** (wenn ja, fügen Sie bitte ein 'sql-server' Tag), oder meinen Sie" SQL in Microsoft Access "(wenn ja, fügen Sie bitte ein 'ms-access' Tag) –

+1

Verstanden, danke marc_s. – aksum

Antwort

0

Dies sollte bekommen, was Sie brauchen ...

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 

Zusätzlich Ich würde vorschlagen, eine Spalte zu Ihrer Studententabelle für das letzte Kommunikationsdatum hinzuzufügen (oder sogar eine ID, wenn die Kommunikation eine Spalte mit automatischer Erhöhung hat, wie mehrere Einträge am selben Tag). Dann aktualisieren Sie über einen Insert-Trigger für die Kommunikationstabelle die Student-Tabelle mit dem neuesten Datum (oder der Kommunikations-ID). Dann müssen Sie das MAX() nicht mehr erneut abfragen und mehrmals neu verbinden, wie dies der Fall ist.

+0

Danke DRapp, genagelt! – aksum

1

Dies sollte Sie bekommen, was Sie brauchen. Ich weiß nicht, ob es einen Leistungseinbruch zu tun dies über verschachtelte Unterabfrage ist, aber Ich mag die saubere Syntax dafür:

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 
Verwandte Themen