![]() |
Datenbank: MSDE • Zugriff über: ADO
Sql-Sortieung - einzelne Datensätze
Hi allerseits,
habe eine Frage zu SQL-Server. Ich benutze MSDE und habe eine Tabelle (Kundenstamm) mit mehr als 100.000 Datensätzen. In dieser Tabelle gibt es einen Primärschlüssel (Kundennummer) und einen Index (Suchbegriff+Kundennummer). Der PK ist (logo!) eindeutig, der Suchbegriff ist nicht eindeutig, da es ja mehrere Kunden mit gleichlautendem Suchbegriff geben kann - deshalb habe ich die Kundennummer an diesen Index mit rangehängt, um innerhalb gleicher Suchbegriffe eine Sortierung nach Kundennummer zu haben. Ich möchte jetzt ein SQL-Kommando absetzen, welches mir immer den jeweils nächsten bzw. vorigen Kunden sortiert nach Suchbegriff liefert. Ich kann natürlich mit
SQL-Code:
alle Kunden einmalig in ein Dataset sortiert einlesen und dann einzeln aus dem Dataset abarbeiten. Dabei habe ich allerdings das Problem, dass mir sämtliche Kunden eingelesen werden und das dauert bei soviel Datensätzen naturgemäss zu lange.
SELECT * FROM Kunden ORDER BY Suchbegriff, Kundennummer
Wenn ich jetzt mit
SQL-Code:
ins Dataset einlese, dann gehts zwar rattenschnell, ich habe aber nur den ersten Datensatz im Dataset. Wie komme ich dann mit einem weiteren SQL-Kommando an den nächsten Datensatz ran? Gibt es irgendwie eine Möglichkeit dem SQL-Server zu sagen wo er anfangen soll und dann mit einem Kommando den jeweils nächsten Datensatz abzufragen?
SELECT TOP 1 * FROM Kunden ORDER BY Suchbegriff, Kundennummer
|
Re: Sql-Sortieung - einzelne Datensätze
Hi Eddie,
irgendwas stimmt eventuell mit deinem Datendesign noch nicht, oder deine Darstellung des Problems ist zu stark komprimiert - vielleicht bringt dich das hier auf eine Idee:
SQL-Code:
Wenn du die aktuellen Werte für :such und :kdnr als Parameter übergibst, dann erhältst du die nachfolgende KundenNummer. Für die vorhergehende sollte das hier funktionieren:
SELECT TOP 1 KundenNummer
FROM Kunden WHERE SuchBegriff = :such AND KundenNummer > :kdnr ORDER BY Kundennummer
SQL-Code:
Grüße vom marabu
SELECT TOP 1 KundenNummer
FROM Kunden WHERE SuchBegriff = :such AND KundenNummer < :kdnr ORDER BY Kundennummer DESC |
Re: Sql-Sortieung - einzelne Datensätze
Hi Marabu,
danke für die schnelle Antwort. Kann das mal ausprobieren: da ich SQL-Newbie bin weiss ich mit den Parametern noch nicht so recht bescheid, werde ich aber bestimmt auch irgendwo finden. Ich glaube aber nicht dass der beschriebene Weg mein Prob löst. Angenommen ich habe die folgenden Datensätze: Suchbegriff/ Kundennummer AAA / 4711 AAA / 4712 AAB / 0815 AAC / 2123 dann würde ich mit
SQL-Code:
den ersten Datensatz lesen (4712),
SELECT TOP 1 * FROM Kunden ORDER BY Suchbegriff, Kundennummer
hätte dann mit
SQL-Code:
zu prüfen obs noch einen gibt, würde den zweiten Datensatz kriegen, (4712)
SELECT TOP 1 * FROM Kunden WHERE Suchbegriff=AAA and Kundennummer>4711 ORDER BY Suchbegriff, Kundennummer
müsste wieder mit
SQL-Code:
prüfen, würde keinen Datensatz kriegen,
SELECT TOP 1 * FROM Kunden WHERE Suchbegriff=AAA and Kundennummer>4712 ORDER BY Suchbegriff, Kundennummer
um dann mit
SQL-Code:
den nächsten Datensatz (0815) als Ergebnis zu erhalten.
SELECT TOP 1 * FROM Kunden WHERE Suchbegriff>AAA ORDER BY Suchbegriff, Kundennummer
Das scheint mir zwar machbar aber recht komliziert, zumal ich mitunter Tabellen mit Schlüsseln habe, die aus mehr als zwei Feldern zusammengesetzt sind. |
Re: Sql-Sortieung - einzelne Datensätze
es gibt auch die limit funktion:
kannst mal schauen, ob das was bringt für dich:
SQL-Code:
SELECT * FROM table LIMIT 0 , 5
|
Re: Sql-Sortieung - einzelne Datensätze
Nö, leider nicht, ist ja letztendlich auch nix anderes als TOP X (glaub ich).
Danke trotzdem |
Re: Sql-Sortieung - einzelne Datensätze
Hallo Eddie,
Zitat:
SQL-Code:
Durch die Beschränkung auf die KundenNummer im result set hält sich die übermittelte Datenmenge in Grenzen. Eine weitere Möglichkeit zur Reduzierung der Datenmenge bietet die CursorLocation clUseServer. Die Detailinfos holst du dann anhand des Schlüssels on demand aus der Datenbank:
SELECT KundenNummer FROM Kunden ORDER BY Suchbegriff, KundenNummer
SQL-Code:
Das mit den Parametern ist nicht sonderlich schwierig. Wenn du das Statement schon im Object Inspector der Eigenschaft SQL deiner Query (DetailsQuery) zuweist, dann wird es auf vorhandene Parameter (:param) untersucht. Die gefundenen Parameter werden bei "ParamCheck = TRUE" in die Parameterliste der Query eingetragen und du kannst ihnen dann vor dem Öffnen der Query Werte zuweisen:
SELECT * FROM Kunden WHERE KundenNummer = :kdnr
Delphi-Quellcode:
Ohne den vollständigen Use Case ist eine optimale Beratung kaum möglich, aber vielleicht hilft dir mein Beitrag ja ein wenig auf deinem eigenen Weg zur fertigen Lösung.
begin
with DetailsQuery do begin Close; Parameters.ParamValues['kdnr'] := SortedQuery.FieldValues['KundenNummer']; Open; end; end; marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 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