2009-08-14 6 views
4

Tabelle - Employee.Status.XREFRekord Zurück mit max Datum

Client Employee Date 
198  Jon Doe  3/1/2009 
198  Jon Doe  1/1/2009 

Tabelle - Employee.Status.History

Client Employee Date  Status 
198  Jon Doe  5/21/2009 T 
198  Jon Doe  3/1/2009 A 
198  Jon Doe  1/1/2009 P 

Nur Abfrage Datensätze in beiden Employee.Status.History und Employee.Status.XREF wo Client, Employee und Date Spiel.

Return nur der Datensatz aus Employee.Status.History mit dem max Datum (von client von employee) In diesem Fall ist es

Client Employee Date  Status 
198  Jon Doe  3/1/2009 A 

Antwort

0

MySql zurückkehren würde:

SELECT b.* FROM tableXREF a, tableSTATUS b 
WHERE b.client = a.client 
ORDER BY b.Date DESC 
LIMIT 1 

MsSql:

SELECT TOP(1) b.field1, b.field2 etc. FROM tableXREF a, tableSTATUS b 
WHERE b.client = a.client 
ORDER BY b.Date DESC 

Ich denke ...

+0

Ihre Lösung funktioniert nur, wenn es in der Datenbank einen Benutzer ist. Der Trick besteht darin, Datensätze mit der maximalen Historie für alle Benutzer zurückzugeben. – Maciej

4

eine Unterauswahl & Gruppe Verwendung von:

select b.* 
from Employee.Status.History b, 
(select client, employee, max(date) date 
    from Employee.Status.XREF 
    group by client, employee 
) a 
where b.client = a.client 
and b.employee = a.employee 
and b.date = a.date 

Die innere Abfrage wählt das jüngste Datum.
Die äußere Abfrage gibt den gesamten Datensatz an diesem Datum für den zugeordneten Client und Mitarbeiter zurück.

-1

Warum verwenden Sie keine Join mit einer Gruppierung nach Klausel?

select h.client,h.employee,max(h.date),h.Status 
from Employee.Status.History h inner join Employee.Status.XREF x on 
h.client=x.client and 
h.employee=x.employee and 
h.date=x.date 
group by h.client,h.employee,h.Status 
+0

max (h.date) gibt für jeden von der Auswahl zurückgegebenen Datensatz dasselbe Datum zurück (das maximale Datum in der Menge). OP erwartet, dass die Abfrage den verknüpften Datensatz mit dem maximalen Datum zurückgibt. Diese zwei Dinge sind sehr unterschiedlich und daher ist Ihre Anfrage falsch. – Maciej

1

sollte diese Arbeit:

SELECT h.* 
FROM Employee.Status.History h 
INNER JOIN (
    SELECT h.Client, MAX(h.Date) AS MaxDate 
    FROM Employee.Status.History h 
    INNER JOIN Employee.Status.XREF x ON h.Client = x.Client 
     AND h.Employee = x.Employee AND h.Date = x.Date 
) q ON h.Client = q.Client