Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensatznummer in einer SQL Anweisung ausgeben? (https://www.delphipraxis.net/56238-datensatznummer-einer-sql-anweisung-ausgeben.html)

hitzi 2. Nov 2005 17:35

Datenbank: Access • Zugriff über: ODBC

Datensatznummer in einer SQL Anweisung ausgeben?
 
Hallo,

wie kann ich die Datensatznummer schon in einen SQL ausgeben?
In diesem Fall handelt es sich um eine Access Datenbank.

Ich dachte an sowas wie select name1, betrag, indexof(*) from user order by name1

nur gibt es kein indexof.

Vielen Dank schonmal
Thomas

Ulf346C 2. Nov 2005 18:17

Re: Datensatznummer in einer SQL Anweisung ausgeben?
 
Eine SQl-DB muß nicht zwingend ein Schlüsselfeld haben.
Daher haben die Datensätze auch keine "Index"-Nummer.

Du müßtest feststellen ob es in der Tabelle einen "primary key" gibt.

hitzi 2. Nov 2005 18:29

Re: Datensatznummer in einer SQL Anweisung ausgeben?
 
Ich meine das eher so:

Name1 betrag
Thomas 12
Andreas 9
Lothar 11

Wenn das nun das nun unsortiert ausgegebe (select name1 from users)
ist Thomas an der Position 1, Andreas an der Position 2 und Lothar an der Position 3.
Gebe ich nun die Tabelle sortiert nach Betrag aus (select name1 from users order by betrag)
dann ist Andreas an Position 1, Lothar an Position 2 und Thomas an Position 3.

Eben diese Position hätte ich gern schon im SQL ermittelt.

r_kerber 2. Nov 2005 20:13

Re: Datensatznummer in einer SQL Anweisung ausgeben?
 
SQL-Code:
SELECT name1 FROM users ORDER BY betrag

hitzi 3. Nov 2005 05:57

Re: Datensatznummer in einer SQL Anweisung ausgeben?
 
Hä? Das ist doch genau das SQL was ich schon selber geschrieben habe.
Die Sortierung ist nicht das Problem, sondern die Ermittlung der Datensatznummer des jeweiligen Datensatzes in der Ergebnisdatenmenge.

Gruss

alzaimar 3. Nov 2005 06:06

Re: Datensatznummer in einer SQL Anweisung ausgeben?
 
Es gibt bei SQL per se keine Datensatznummern, da SQL eine mengenbasierte Datenbankabfragesprache darstellt. Im Gegensatz zu einer ISAM (DBase, Access etc.), die die Daten als Tabellen mit Datensatznummer auffässt, sieht SQL eine 'Tabelle' als Menge von Datensätzen ohne innere Ordnung an. Die SQL-Konstrukte JOIN (Schnittmenge) und UNION (Vereinigung) spiegeln dieses Konzept wieder.

Die DB-Server verhalten sich ähnlich. In einzelnen Implementierungen (IB, Firebird z.B.) kann man zwar auf eine Datensatznummer zugreifen, aber das ist eine Krücke und, ich wiederhole mich, eigentlich nicht SQL-konform.

Du musst Dir deine Datensatznummer selbst basteln, indem Du eine zusätzliche Spalte einführst, die mit einem eindeutigen Wert (z.B. mit Hilfe eines Zählers) gefüllt ist. Bei MS-SQL ist das eine 'IDENTIY'-Spalte, FB und IB verwenden hierfür i.A. einen Generator.

marabu 3. Nov 2005 07:01

Re: Datensatznummer in einer SQL Anweisung ausgeben?
 
Hallo Thomas,

ich habe dich so verstanden, dass du keine feste Datensatznummer speichern möchtest, sondern eine fortlaufende Ordinalzahl in Abhängigkeit von einer Sortierung über die ORDER-BY-Klausel mit ausgeben möchtest. Für die reine SQL-Lösung fehlt dazu in Access leider ein Generator. Es gibt zwar die Krücke mit der temporären Tabelle (SELECT ... INTO zum Anlegen einer leeren Tabelle, ALTER TABLE zum einfügen eines IDENTITY Feldes, INSERT INTO ... SELECT ... zum Füllen und Durchnummerieren), aber eigentlich brauchst du das doch gar nicht. In deinem Programm kannst du doch auf die Eigenschaft RecNo eines DataSet zugreifen. In einem computed field kannst du diese Ordinalzahl sogar noch ausgeben, wenn es sein muss.

Grüße vom marabu

r_kerber 3. Nov 2005 08:03

Re: Datensatznummer in einer SQL Anweisung ausgeben?
 
Zitat:

Zitat von hitzi
Hä? Das ist doch genau das SQL was ich schon selber geschrieben habe.

Ooops, da habe ich wohl nur die Hälfte gelesen. :oops:

mschaefer 3. Nov 2005 08:18

Re: Datensatznummer in einer SQL Anweisung ausgeben?
 
Moin, moin,

ja das ist wahrscheinlich in SQL bei Access nicht drin. Es gibt einige SQL-Dialecte, die den Befehl ROWNUM haben, also man kann dan ein Statement bauen SELECT ROWNUM FROM TABLE, Access hat da aber nichts vergleichbares. Bei interbase würde man eine StoredProcedure bauen (im Fyracle Project gibt es ROWNUM ). Ein Statement wie SELECT Count(ID) FROM Table verweigern DBMS.

Du könntest im Dataset ein berechnetes Feld anlegen, das ist dann zwar nicht im SQL, spart aber dafür Netzbandbreite, denn Deine Application macht das ja intern ehedem. Vielleicht könntest Du ein DBGrid ableiten, was die erste Spalte als Zählspalte anzeigt.

Grüße // Martin


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 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