AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Prism Sql-Sortieung - einzelne Datensätze
Thema durchsuchen
Ansicht
Themen-Optionen

Sql-Sortieung - einzelne Datensätze

Ein Thema von eddie11 · begonnen am 29. Nov 2005 · letzter Beitrag vom 29. Nov 2005
Antwort Antwort
eddie11

Registriert seit: 8. Nov 2005
Ort: Zossen bei Berlin
236 Beiträge
 
Delphi XE8 Professional
 
#1

Sql-Sortieung - einzelne Datensätze

  Alt 29. Nov 2005, 12:00
Datenbank: MSDE • Zugriff über: ADO
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 mitSELECT * 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 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?
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

Die Kontramedüse ist verdrupelt!!!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Sql-Sortieung - einzelne Datensätze

  Alt 29. Nov 2005, 13:16
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
  Mit Zitat antworten Zitat
eddie11

Registriert seit: 8. Nov 2005
Ort: Zossen bei Berlin
236 Beiträge
 
Delphi XE8 Professional
 
#3

Re: Sql-Sortieung - einzelne Datensätze

  Alt 29. Nov 2005, 13:45
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 SELECT TOP 1 * FROM Kunden ORDER BY Suchbegriff, Kundennummer den ersten Datensatz lesen (4712),
hätte dann mit 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 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 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.
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

Die Kontramedüse ist verdrupelt!!!
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#4

Re: Sql-Sortieung - einzelne Datensätze

  Alt 29. Nov 2005, 14:36
es gibt auch die limit funktion:

kannst mal schauen, ob das was bringt für dich:

SELECT * FROM table LIMIT 0 , 5
  Mit Zitat antworten Zitat
eddie11

Registriert seit: 8. Nov 2005
Ort: Zossen bei Berlin
236 Beiträge
 
Delphi XE8 Professional
 
#5

Re: Sql-Sortieung - einzelne Datensätze

  Alt 29. Nov 2005, 16:05
Nö, leider nicht, ist ja letztendlich auch nix anderes als TOP X (glaub ich).
Danke trotzdem
Edgar Leifeld
Liebe Grüße aus Zossen bei Berlin

Die Kontramedüse ist verdrupelt!!!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Sql-Sortieung - einzelne Datensätze

  Alt 29. Nov 2005, 17:22
Hallo Eddie,

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:

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:

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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz