![]() |
Datenbank: Access / SQL Server • Version: 2010 • Zugriff über: ADO
SELECT TOP ... DESC umsortieren
Hallo,
ich habe eine Stundenliste mit Datum. Damit der Nutzer nicht alle Daten laden muß und ich nicht weiss, wann die letzten Einträge ware, habe ich SELECT TOP 20 gewählt. Ich benutze ein cxGrid von DEVEX im Gridmode, sonst wird das Ding bocklangsam wenn der Nutzer > 500 Datensätze abruft. Im Gridmode sortiert das Grid nicht selbst, sondern ich über SQL. Wenn ich jetzt von DESC auf ASC umschalte dann holt die Abfage die daten von 1965 (oder so). Wie kann ich das verhindern? Hat jemand einen Rat? |
AW: SELECT TOP ... DESC umsortieren
Mann, da grübel ich rum wie blöd, kaum hab ichs hier geschrieben, habe ich die Lösung.
Soll ich schreiben wie? Oder wisst ihr das alle? Na gut.
Code:
SELECT * FROM tStunden
WHERE [Datum] IN (SELECT TOP 20 [Datum] FROM tStunden ORDER BY [Date] DESC) ORDER BY [Date] |
AW: SELECT TOP ... DESC umsortieren
Wenn dein cxGrid schon bei 500 Records lahm wird, liegt der Fehler bei Dir. Das Teil wird erst bei >5000 Recs etwas behäbig. Ich hab bis zu 2000 im Grid (150 Spalten) und der Anwender merkt nix.
Edit: Sollte nicht auch das gehen:
Code:
select top 20 * from Tabelle order by Feld
|
AW: SELECT TOP ... DESC umsortieren
Es geht ja wohl um die absteigende Sortierung.
Das in kann man sich sparen, man muss die Top Menge nur umdrehen.
Code:
Bezüglich Performance die Standardfrage:
Select * from
(SELECT TOP 20 [Datum] FROM tStunden ORDER BY [Date] DESC) order by [Datum] Wie sieht es mit Indizierung aus? |
AW: SELECT TOP ... DESC umsortieren
Zitat:
Index ist da, aer im Hintergrund läuft noch ne Menge Zeug - kann ich sicher noch optimieren. Es geht eigentlich nicht um die 500, da ist nur eine leichte Verzögerung zu spüren, sondern um das Angebot an den Nutzer, sich auch mal einen größeren Zeitraum anzuschauen. Das können dann 10-tausende sein. JA, ich weiß. bei vielen träuben sich die Nackenhaare. Aber, ich bin selbst Nutzer, habe das Programm programmiert, weil ich genau das wollte (u.A.). |
AW: SELECT TOP ... DESC umsortieren
Für Access nicht zu gebrauchen da hier üblicherweise mit clServer gearbeitet wird, aber für SQL-Server mit Datenmengen die den Gridmode benötigen (~>5000) verwende ich ein Event in meinem Template welches den Views zugeordnet wird um die Daten entsprechend der über dass Grid zu definierenden Sortierungen clientzseitig über ADO-Sort abfackelt.
Delphi-Quellcode:
Const
C_SORTTYPE:Array[TcxDataSortOrder] of String=('ASC','ASC','DESC'); procedure TTemplate.AllGridDataControllerSortingChanged(Sender: TObject); var i:Integer; sl:TStringList; begin if TcxGridDBDataController(Sender).DataModeController.GridMode then begin sl:=TStringList.Create; sl.Delimiter := ','; sl.StrictDelimiter :=true; for I := 0 to TcxGridDBDataController(Sender).GridView.SortedItemCount - 1 do begin if TcxGridItemDBDataBinding(TcxGridDBDataController(Sender).GridView.SortedItems[i].DataBinding).Field.FieldKind=fkData then sl.Add(TcxGridItemDBDataBinding(TcxGridDBDataController(Sender).GridView.SortedItems[i].DataBinding).FieldName + ' ' + C_SORTTYPE[TcxGridDBDataController(Sender).GridView.SortedItems[i].SortOrder]) end; TAdodataset(TcxGridDBDataController(Sender).Datasource.DataSet).Sort := sl.DelimitedText; sl.Free; end; end; |
AW: SELECT TOP ... DESC umsortieren
Zitat:
Es macht einfach keinen Sinn das Datum noch mal mit "in" abzugleichen, wenn die Menge selbst schon richtig ist. Geht es nicht? Zu den großem Mengen: Warum muss es unbedingt per TOP gemacht werden? Wieso lässt Du den Nutzer nicht gleich die untere Datumsgrenze selbst wählen? Ob es nun TOP 500, TOP 1000 oder TOP 10000 sind, dürfte relativ schnuppe sein. Als Nutzer würde ich eine konkrete Datumsgrenze ala: alles von letzter Woche, letztem Monat, letzten 12 Monaten vermutlich bevorzugen. |
AW: SELECT TOP ... DESC umsortieren
'ORDER BY' ist nur dann schnell bzw. dauert gar nicht, wenn auf dem zu sortierenden Feld ein 'clustered index' liegt.
Haben die neueren DevExpress-Teile nicht 'Paging' eingebaut, oder hast Du auch 'nur' das alte? |
AW: SELECT TOP ... DESC umsortieren
TOP:
Wenn das Form startet und ein Datumsbereich angegeben ist, kann es sein, dass die Tabelle leer ist. Kein schöber Effekt. Der Nutzer muß sich einen Bereich suchen, in dem er Daten findet. Nicht gut. Besser, er bekommt die letzten eingegebenen Daten zu sehen und kann sich orientieren. Also TOP. Oder nicht? Bummi, genau das Template verwende ich auch. jobo, ich finde, wenn Du Vorschläge machst - danke dafür - solltest Du es auch probiert haben. Furtbichler, ich habe die 5er, Paging ist aber drin, deshalb geht es sehr schnell bei 50.000 DS, aber nur bei Gridmode. Oder habe ich da was nicht verstanden? Ich WILL die TOP 20, also nehme ich sie. Dabei werden je nach Sortierrichtung entweder die vo 2014 oder die von 1936 genommen. Also isoliere ich die TOP 20 mit IN und kann dann ganz in Ruhe mit arbeiten. Das läuft schnell und Problemlos, oder gibt's was besseres? |
AW: SELECT TOP ... DESC umsortieren
Code:
Das funktioniert nicht bei jeder Datenbank, Oracle kann's so, SQL-Server (versionsabhängig?) und Access benötigen eine kleine Abwandlung:
Select * from
(SELECT TOP 20 [Datum] FROM tStunden ORDER BY [Date] DESC) order by [Datum]
Code:
Select * from
(SELECT TOP 20 [Datum] FROM tStunden ORDER BY [Date] DESC) IrgendEinName order by [Datum] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz