Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism Sql-Sortieung - einzelne Datensätze (https://www.delphipraxis.net/57951-sql-sortieung-einzelne-datensaetze.html)

eddie11 29. Nov 2005 11:00

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:
SELECT * FROM Kunden ORDER BY Suchbegriff, Kundennummer
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.

Wenn ich jetzt mit
SQL-Code:
SELECT TOP 1 * FROM Kunden ORDER BY Suchbegriff, Kundennummer
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?

marabu 29. Nov 2005 12:16

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:
SELECT TOP 1 KundenNummer
FROM Kunden
WHERE SuchBegriff = :such AND KundenNummer > :kdnr
ORDER BY Kundennummer
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:

SQL-Code:
SELECT TOP 1 KundenNummer
FROM Kunden
WHERE SuchBegriff = :such AND KundenNummer < :kdnr
ORDER BY Kundennummer DESC
Grüße vom marabu

eddie11 29. Nov 2005 12:45

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:
SELECT TOP 1 * FROM Kunden ORDER BY Suchbegriff, Kundennummer
den ersten Datensatz lesen (4712),
hätte dann mit
SQL-Code:
SELECT TOP 1 * FROM Kunden WHERE Suchbegriff=AAA and Kundennummer>4711 ORDER BY Suchbegriff, Kundennummer
zu prüfen obs noch einen gibt, würde den zweiten Datensatz kriegen, (4712)
müsste wieder mit
SQL-Code:
SELECT TOP 1 * FROM Kunden WHERE Suchbegriff=AAA and Kundennummer>4712 ORDER BY Suchbegriff, Kundennummer
prüfen, würde keinen Datensatz kriegen,
um dann mit
SQL-Code:
SELECT TOP 1 * FROM Kunden WHERE Suchbegriff>AAA ORDER BY Suchbegriff, Kundennummer
den nächsten Datensatz (0815) als Ergebnis zu erhalten.

Das scheint mir zwar machbar aber recht komliziert, zumal ich mitunter Tabellen mit Schlüsseln habe, die aus mehr als zwei Feldern zusammengesetzt sind.

mumu 29. Nov 2005 13:36

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

eddie11 29. Nov 2005 15:05

Re: Sql-Sortieung - einzelne Datensätze
 
Nö, leider nicht, ist ja letztendlich auch nix anderes als TOP X (glaub ich).
Danke trotzdem

marabu 29. Nov 2005 16:22

Re: Sql-Sortieung - einzelne Datensätze
 
Hallo Eddie,

Zitat:

Zitat von eddie11
Das scheint mir zwar machbar aber recht komliziert, zumal ich mitunter Tabellen mit Schlüsseln habe, die aus mehr als zwei Feldern zusammengesetzt sind.

mein Lösungsvorschlag passt zu deiner Problembeschreibung. Wenn du aber sowieso durch die Gesamtdaten scrollen willst, dann besorge dir die sortierten Schlüssel als Grundlage in einer Query (SortedQuery), die du dann offen hältst:

SQL-Code:
SELECT KundenNummer FROM Kunden ORDER BY Suchbegriff, KundenNummer
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:

SQL-Code:
SELECT * FROM Kunden WHERE KundenNummer = :kdnr
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:

Delphi-Quellcode:
begin
  with DetailsQuery do
  begin
    Close;
    Parameters.ParamValues['kdnr'] := SortedQuery.FieldValues['KundenNummer'];
    Open;
  end;
end;
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.

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