Die aktuellsten Datensätze mit SELECT erhalten?
MS SQL Server 2008
Ich habe eine Tabelle mit über 100.000 Datensätzen. Jeder Datensatz hat eine 8-Stellige ID und von fast jedem Datensatz gibt es mehrere Varianten in der Tabelle. Nun möchte ich bei jeder Abfrage jeweils die aktuellste Version von jedem Datensatz erhalten.
Hier ist mein SELECT:
SELECT *
FROM tb_parts_xl TP
WHERE <irgendwas> AND p_ic_datetime = (SELECT MAX(p_ic_datetime) FROM tb_parts_xl WHERE p_id = TP.p_id)
Leider bekomme ich die Einträge trotzdem mehrfach zurück. Was mache ich falsch?
Ich habe eine Tabelle mit über 100.000 Datensätzen. Jeder Datensatz hat eine 8-Stellige ID und von fast jedem Datensatz gibt es mehrere Varianten in der Tabelle. Nun möchte ich bei jeder Abfrage jeweils die aktuellste Version von jedem Datensatz erhalten.
Hier ist mein SELECT:
SELECT *
FROM tb_parts_xl TP
WHERE <irgendwas> AND p_ic_datetime = (SELECT MAX(p_ic_datetime) FROM tb_parts_xl WHERE p_id = TP.p_id)
Leider bekomme ich die Einträge trotzdem mehrfach zurück. Was mache ich falsch?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 152603
Url: https://administrator.de/forum/die-aktuellsten-datensaetze-mit-select-erhalten-152603.html
Ausgedruckt am: 07.04.2025 um 12:04 Uhr
4 Kommentare
Neuester Kommentar
Moin nxclass,

@ralfik
WTF bedeutet denn:
Du vergleichst doch nur auf "ID". OHNE GROUP BY (wo nxclass Recht hat, hat er Recht).
Was soll denn da anderes passieren als "mehrere Sätze"?
So sollten jeweils die aktuellsten Datensätzer je ID kommen.
Grüße
Biber
Zitat von @nxclass:
Eine Kombination aus ORDER und GROUP sollte helfen. -
Nach meiner Erfahrung wird der erste Datensatz einer Gruppe dann ausgegeben.
Nach meiner Erfahrung hauen einem die gängigen Parser einen aufs Maul bei einem SELECT * FROM.....GROUP BY einFeld..Eine Kombination aus ORDER und GROUP sollte helfen. -
Nach meiner Erfahrung wird der erste Datensatz einer Gruppe dann ausgegeben.
> SELECT *
> FROM tb_parts_xl
> ORDER BY `p_ic_datetime`
> GROUP BY `p_id`
>
@ralfik
WTF bedeutet denn:
"Jeder Datensatz hat eine 8-Stellige ID und von fast jedem Datensatz gibt es mehrere Varianten in der Tabelle."
Du vergleichst doch nur auf "ID". OHNE GROUP BY (wo nxclass Recht hat, hat er Recht).
Was soll denn da anderes passieren als "mehrere Sätze"?
SELECT *
FROM tb_parts_xl TP,
(SELECT MAX(ic_datetime) as Max_ts, id
FROM tb_parts_xl
GROUP BY ID) p
WHERE <TP-irgendwas =irgendwasKonstantes>
And p.id = TP.p_id
AND p.max_ts = TP.IC_Datetime
So sollten jeweils die aktuellsten Datensätzer je ID kommen.
Grüße
Biber
Ich würde sagen das ist kein gutes Datenbankdesign. Wenn es schon versionierte Datensätze in einer Tabelle gibt dann sollte es wenigstens auch ein Feld geben in dem ein Versionszähler hochgezählt wird. Dann ließe sich sowas einfach mit MAX() erledigen.
Verweisen denn die versionierten Datensätze evtl. auf eine andere Tabelle (Verknüpfungsfeld) welches für die versionierten Datensätze eindeutig ist? Wenn ja könntest du ein ORDER BY p_ic_datetime DESC GROUP BY {Verknüpfungsfeld} machen.
Verweisen denn die versionierten Datensätze evtl. auf eine andere Tabelle (Verknüpfungsfeld) welches für die versionierten Datensätze eindeutig ist? Wenn ja könntest du ein ORDER BY p_ic_datetime DESC GROUP BY {Verknüpfungsfeld} machen.