2010-01-18 4 views
7

Entschuldigung der Titel der Auswahl, ich nicht mit etwas kurz und auf den Punkt ... habenneuesten Zeilen pro deutliche Fremdschlüsselwert

kommen konnte ich eine Tabelle ‚Updates‘ bekam mit den drei Spalten, Text , typeid, created - text ist ein Textfeld, typeid ist ein Fremdschlüssel aus einer 'type'-Tabelle und wird mit einem Zeitstempel erstellt. Ein Benutzer gibt ein Update ein und wählt den Typ aus, dem er ebenfalls entspricht.

Es gibt eine entsprechende 'type' Tabelle mit den Spalten 'id' und 'name'.

Ich versuche, mit einer Ergebnismenge mit so vielen Zeilen wie in der Tabelle "Typ" und dem neuesten Wert von updates.text für die bestimmte Zeile in Typen zu enden. Also, wenn ich 3 Typen habe, würden 3 Zeilen zurückgegeben, eine Zeile für jeden Typ und der letzte updates.text Wert für den fraglichen Typ.

Irgendwelche Ideen?

danke,

John.

Antwort

14
select u.text, u.typeid, u.created, t.name 
from (
    select typeid, max(created) as MaxCreated 
    from updates 
    group by typeid 
) mu 
inner join updates u on mu.typeid = u.typeid and mu.MaxCreated = u.Created 
left outer join type t on u.typeid = t.typeid 
0

Was sind die tatsächlichen Spalten, die Sie zurückgeben möchten?

SELECT t.*, 
     y.* 
    FROM TYPE t 
    JOIN (SELECT u.typeid, 
       MAX(u.created) 'max_created' 
      FROM UPDATES u 
     GROUP BY u.typeid) x ON x.typeid = t.id 
    JOIN UPDATES y ON y.typeid = x.typeid 
       AND y.created = x.max_created 
0
SELECT 
    TYP.id, 
    TYP.name, 
    TXT.comment 
FROM 
    dbo.Types TYP 
INNER JOIN dbo.Type_Comments TXT ON 
    TXT.type_id = TYP.id 
WHERE 
    NOT EXISTS 
    (
      SELECT 
       * 
      FROM 
       dbo.Type_Comments TXT2 
      WHERE 
       TXT2.type_id = TYP.id AND 
       TXT2.created > TXT.created 
    ) 

Oder:

SELECT 
    TYP.id, 
    TYP.name, 
    TXT.comment 
FROM 
    dbo.Types TYP 
INNER JOIN dbo.Type_Comments TXT ON 
    TXT.type_id = TYP.id 
LEFT OUTER JOIN dbo.Type_Comments TXT2 ON 
    TXT2.type_id = TYP.id AND 
    TXT2.created > TXT.created 
WHERE 
    TXT2.type_id IS NULL 

In jedem Fall, wenn das Erstellungsdatum zwischen zwei Zeilen mit demselben type_id identisch sein kann, dann würden Sie für das berücksichtigen müssen.

Ich habe auch angenommen, dass mindestens ein Kommentar pro Typ existiert. Wenn das nicht der Fall ist, müssten Sie auch eine kleine Anpassung vornehmen.