2009-05-19 7 views
0

Ich habe zwei Tabellen Eltern und Kind (bezogen als solche auf PK/FK GUID)SQL SELECT WHERE Ärger irgendwelche Ideen hilfreich

Kind hat einen Zeitstempel (die Datensatzerstellung Datum/Uhrzeit).

Was ich tun möchte, ist nur den jüngsten Kind-Datensatz und den Eltern-Datensatz, für jeden Eltern-Datensatz.

SELECT 
    dbo_Parents.ParentName, 
    dbo_ChildEntry.CountPropertys, 
    dbo_ChildEntry.DateTimeStamp 
FROM 
    dbo_Parents INNER JOIN dbo_ChildEntry 
ON 
    dbo_Parents.ParentID = dbo_ChildEntry.ParentID 
WHERE 
    ([WHAT SHOULD BE HERE?])) 
+0

Sie müssen "neueste" definieren. – fbinder

+0

Ich möchte nur die untergeordnete Zeile mit dem neuesten Datumsstempel auswählen (dh welcher Eintrag enthält den Zeitstempel, der dem nächsten() am nächsten kommt) – Nate

+0

Erwarten Sie eine Ergebniszeile pro Elternteil oder ein Ergebnis insgesamt? – Andomar

Antwort

8

Vorausgesetzt, dass Sie den neuesten Eintrag möchten, müssen Sie TOP 1 verwenden und durch bestellen.

SELECT TOP 1 
dbo_Parents.ParentName, 
dbo_ChildEntry.CountPropertys, 
dbo_ChildEntry.DateTimeStamp 
FROM dbo_Parents 
INNER JOIN dbo_ChildEntry ON dbo_Parents.ParentID = dbo_ChildEntry.ParentID 
ORDER BY dbo_ChildEntry.DateTimeStamp desc 

bearbeiten nach Klärung: "das jüngste Kind Rekord und der übergeordnete Datensatz, für jeden Elternteil record":

WHERE dbo_ChildEntry.DateTimeStamp = 
     (Select Max(dbo_ChildEntry.DateTimeStamp) 
       from dbo_ChildEntry 
       where dbo_Parents.ParentID = dbo_ChildEntry.ParentId) 
+0

Mein Schlechter - Ich möchte, sollte klarer sein (Frage bearbeitet). Ich möchte das letzte Kind und seine Eltern für jedes Elternteil zurückgeben. – Nate

+0

Funktioniert gut, danke! – Nate

3
WHERE dbo.ChildEntry.DateTimeStamp = (Select Max(c.DateTimeStamp) 
             from dbo.ChildEntry c 
             where dbo_Parents.ParentID = c.ParentId) 
-1

Versuchen

SELECT  dbo_Parents.ParentName,  dbo_ChildEntry.CountPropertys,  
max(dbo_ChildEntry.DateTimeStamp) 
FROM  dbo_Parents 
INNER JOIN dbo_ChildEntry ON dbo_Parents.ParentID = dbo_ChildEntry.ParentID 
group by dbo_Parents.ParentName,  dbo_ChildEntry.CountPropertys 
+0

-1 Sie gruppieren auf dbo_ChildEntry.CountProperty, sodass max (datetimestamp) nur den maximalen Zeitstempel für untergeordnete Elemente mit denselben CountProperty-Werten findet. – Andomar

1
select p.ParentName, 
    c.CountPropertys, 
    c.DateTimeStamp 
from (
    select max(DateTimeStamp) as DateTimeStamp, ParentID 
    from dbo_ChildEntry 
    group by ParentID) cm 
inner join dbo_ChildEntry c on cm.DateTimeStamp = c.DateTimeStamp and cm.ParentID = c.ParentID 
inner join dbo_Parents p on c.ParentID = p.ParentID 
0

Seit Du hast klargestellt, dass du eine Zeile pro Elternteil haben möchtest, probiere das aus. Für jede Zeile wird nach einer untergeordneten Zeile mit einem späteren Zeitstempel gesucht. In der WHERE-Klausel wird nach Zeilen gefiltert, die kein "next" Kind haben.

SELECT 
    dbo_Parents.ParentName, 
    cur.CountPropertys, 
    cur.DateTimeStamp 
FROM dbo_Parents 
INNER JOIN dbo_ChildEntry cur 
    ON dbo_Parents.ParentID = cur.ParentID 
LEFT JOIN dbo_ChildEntry next 
    ON dbo_Parents.ParentID = next.ParentID 
    AND next.DateTimeStamp > cur.DateTimeStamp 
WHERE 
    next.DateTimeStamp is null 
Verwandte Themen