2009-05-19 20 views
0

j'ai deux tables parent et enfant (lié en tant que tel sur GUID PK/FK)SQL SELECT WHERE des idées utiles dérangement

enfant a un timestamp (la date de création d'enregistrement/heure). Ce que je veux faire est d'obtenir seulement l'enregistrement d'enfant le plus récent ET l'enregistrement parent, POUR CHAQUE enregistrement parent.

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

Vous devez définir "le plus récent". – fbinder

+0

Je voudrais sélectionner uniquement la ligne enfant avec le datetimestamp le plus récent (ie quel record contient l'horodatage le plus proche de Now()) – Nate

+0

Prévoyez-vous une ligne résultat par parent, ou un résultat au total? – Andomar

Répondre

8

En supposant que vous vouliez l'entrée la plus récente, vous devez utiliser TOP 1 et trier par.

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 

Modifier après la clarification: "enregistrement le plus récent de l'enfant et le dossier parent, pour chaque enregistrement parent":

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

Mon mauvais - je veux aurait dû être plus clair (question éditée). Je veux retourner l'enfant le plus récent et son parent pour chaque parent. – Nate

+0

Fonctionne très bien, merci! – Nate

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

Essayez

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 Vous groupez sur dbo_ChildEntry.CountPropertys, donc max (datetimestamp) ne trouve que l'horodatage maximum pour les enfants avec le même CountPropertyes. – 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

Depuis vous avez précisé que vous aimeriez une rangée par parent, essayez ceci. Pour chaque ligne, il recherche une ligne enfant dont l'horodatage est ultérieur. Dans la clause WHERE, il filtre les lignes qui n'ont pas d'enfant "suivant".

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