Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Wie kann ich die SQL Sortierung in eine Tabelle speichern? (https://www.delphipraxis.net/1593-wie-kann-ich-die-sql-sortierung-eine-tabelle-speichern.html)

Rapthor 12. Dez 2002 07:50


Wie kann ich die SQL Sortierung in eine Tabelle speichern?
 
Der Befehl

Code:
INSERT INTO schueler2 SELECT * FROM schueler ORDER BY name
funktioniert in dieser Form nicht.Irgendwo hab ich auch gelesen, dass der INSERT-Befehl generell nicht mit SELECT zusammenarbeitet.
Jetzt meine Frage: Wie kann ich denn auf anderem Wege eine Sortierung (z.B. nach der Namensspalte) in eine (von mir aus auch neue) Tabelle speichern?

Hilfe! :(

Hansa 12. Dez 2002 09:13

Hi,

ich glaube, Du mußt VALUES benutzen, um die Daten von einer Tabelle in die andere zu kriegen. Bin aber selber noch mit solchen Sachen am experimentieren. Deshalb ohne Gewähr. :mrgreen:

Gruß
Hansa

fiasko 12. Dez 2002 12:48

Hallo,


also ich finde das sehr fragwürdig, was du da machen willst. Ich würde
mich nicht darauf verlassen, das die Datenbank immer in der Reihenfolge
wie die Einträge erstellt wurden die Einträge auch zurückliefert.
Wenn du auf name einen Index stellst, sollte die Datenbank dann eigentlich
die ganze Zeit die Sortierung nach name mit pflegen und keine großen probleme
haben dir das dann mit SELECT auszugeben.
Ein SELECT über alle Reihen und Spalten zu machen ist eigentlich auch nicht Sinn
von einer SQL-Datenbank.


Thomas

MrSpock 12. Dez 2002 13:12

Hallo Rapthor,

Insert und Select passen sogar prima zusammen und zwar sowohl in Interbase als auch in LocalSQL z.B. für Paradox. Stellt sich also die Frage: Mit welcher Datenbank arbeitest du?

Rapthor 12. Dez 2002 14:33

Ich nutze die TTable - Komponente des Delphi 6. Und die Dateierstellung führe ich durch, indem ich auf das TTable - Element rechtsklicke und im Untermenü "Create Table" anwähle. Die Dateiendung ist dann *.db !!!
Ich hoffe das hilft bei der Benennung der Datenbank denn so wirklich weiß ich auch nicht welche Art ich benutze.
Jetzt brauch ich nurnoch eine exakte Befehlszeile für die Speicherung der von SQL durchgeführten Sortierung :(
Danke für die Hilfe ... schonmal im Voraus!
Rapthor

Daniel 12. Dez 2002 14:39

Hallo Rapthor,

Zitat:

Zitat von Rapthor
[...]
Jetzt brauch ich nur noch eine exakte Befehlszeile für die Speicherung der von SQL durchgeführten Sortierung
[...]

Genau das hattest Du doch schon mal gefragt ... und auch eine Antwort erhalten (diese befindet sich im Beitrag von "Bart Simpson"):
http://www.delphipraxis.net/viewtopic.php?p=12480#12480

:wink:

Rapthor 12. Dez 2002 15:08

Ja aber was ist denn nun wenn ich die ganze Sache DOCH speichern will? Sei es einmal außer Frage gestellt ob es sinnvoll ist oder dem Prinzip von SQL widerspricht. Immerhin ist SQL kein Organismus mit menschlichen Gefühlen und Empfindungen :D

sol_e_sombre 12. Dez 2002 17:59

Hallo Rapthor!

Daniel hat schon recht, die Antwort war es schon!
Man kann ja nicht einfach etwas "fordern", wie Du von SQL, was per Definition gar nicht existiert!

Du forderst ja auch von einem Auto nicht, daß Du damit fliegen kannst!
(Jedenfalls nicht kontrolliert :wink: )

Und SQL ist nun mal eine Datenbank-Abfragesprache, die mengenorientiert arbeitet.

Was spricht denn dagegen die Daten beim Auslesen zu sortieren?

Rapthor 12. Dez 2002 18:05

Nagut so sei es denn ... wenn's nicht geht dann muss ich mir was anderes überlegen. :cry:

sol_e_sombre 12. Dez 2002 18:22

Nochmal: Was spricht denn dagegen, die Daten beim Auslesen zu sortieren?
Ich habe die Erfahrung gemacht, daß eine Sortierung immer beim Anzeigen Sinn macht, anderswo ist das doch völlig latte!

Rapthor 12. Dez 2002 18:31

Also:
Was ist wenn du 10000 Datensätze hast (also 10000 Zeilen in deiner Tabelle) und die Tabelle selbst nochmal 10 Spalten hat?
Nehmen wir an du sortierst nach dem Namen der Personen in der Tabelle.
Jetzt haste schön alle die mit "A" anfangen hintereinander und würdest dich total darüber freuen, wenn du genau in DIESEM Zustand nacheinander die 120 Namen editieren könntest...Zeile für Zeile. Es kann doch z.b. sein dass du genau bei allen Personen mit Anfangsbuchstaben "A" einen Wert ändern willst. Aber eben genau nur bei allen die mit A anfangen.
Das war nur ein Beispiel.
Wenn diese Sortierung wieder aufgehoben würde müsste ich ja alle 120 Namen selbst raussuchen und ewig scrollen. Arg! Geht das noch anders als mit SQL?
Danke nochmal für eure Anteilnahme an meinem harten Schicksal

sol_e_sombre 12. Dez 2002 19:14

Dann benutzt Du nicht TTable sondern TQuery, setzt die Eigenschaft SQL.Text auf das entsprechende Statement:

SELECT irgendwas, irgendwie, irgendwann
FROM DeineTabelle
ORDER BY irgendwas

Dann hast Du die Möglichkeit in einem DBGrid diese Daten anzuzeigen und auch zu bearbeiten.
Dazu muß das Select Statement aber auf eine aktualisierbare Datenmeng zeigen, d.h. es sind nur begrenzt Joins erlaubt!

Wenn Du dann eine andere sortierung brauchst, kannst Du, auch zur Laufzeit, die Eigenschaft SQL.Text von TQuery ändern:

...
ORDER BY irgendwie

Das DBGrid zeigt die Daten in der neuen Sortierung an, Du kannst sie wieder bearbeiten.
Und dabei ist Dir die Sortierung in der Datenbank intern völlig egal!

Ist es das ungefähr, was Du willst?

Rapthor 12. Dez 2002 19:22

GENAU so mach ich das ja die ganze Zeit ... mit nem TQuery eben! Nur dass der Sortierbefehl fest auf einen Button gelegt ist.D.H. wenn ich den Button drücke dann führt er diesen Sortierbefehl aus und zeigt das Ergebnis in meinem DBGrid an.Dadurch geht aber die Verbindung zwischen meinem Navigator under der Datasource verloren, so dass ich nach der Sortierung nicht mehr bearbeiten kann.
Wenn ich die Datasource mittels Befehlszeile wieder mit dem DBGrid verknüpfe stellt er allerdings wie gesagt wieder die alte unsortierte Reihenfolge her.

sol_e_sombre 12. Dez 2002 19:48

Schreib mal bitte, was hinter dem ButtonClick steht.

MrSpock 13. Dez 2002 06:52

Hallo Rapthor,

so wie du es beschrieben hast, arbeitest du mit Paradox Tabellen, dann funktioniert auch INSERT mit SELECT. Dein Fehler ist also nicht das SQL Statement, sondern liegt woanders. Deshalb interessiert mich auch, was sol_e_sombre bereits gefragt hat.

Beachte, dass ein INSERT Statement mit ExecSQL und nicht mit Open ausgeführt wird! Und dass dieses Statment keine Datenmenge zurückliefert, sondern das Ergebnis ja wie gewünsht in eine neue Tabell schreibt. Diese kannst du anschließend öffnen und mit dem Nav-Objekt verbinden.

Bart Simpson 13. Dez 2002 11:13

Ich geb zu, ich weiss jetzt nicht wie's bei einem Desktop System wie Paradox, dass Du offensichtlich benutzt (BDE + *.db -> Paradox), aussieht, aber ich denke da müsste das was ich vorschlage auch ganz gut funktionieren:

Leg einfach einen Index bzw. Sekundärindex (ich hoff es heisst noch so in Paradox Version >=7) auf die Spalte, nach der sortiert werden soll. Dann dürfte der Sortiervorgang auch bei 10000 Einträgen (Ok, ok - ich weiss nicht wie's bei Paradox ist, aber bei z.B. MySQL ist's kein Problem) sehr schnell mit dem sortieren fertig sein. Genau für sowas gibt's die Indizes nämlich ;-)

Bart Simpson

Rapthor 13. Dez 2002 16:01

Das steht hinter dem ButtonClick zum Sortieren:

Code:
procedure TForm1.Button2Click(Sender: TObject);

begin
DataSource1.DataSet:=Query1;
Query1.Active:=false;
Query1.Sql.Clear;
Query1.Sql.Add('SELECT * FROM schueler ORDER BY klasse');
Query1.open;
Query1.Active:=true;
end;

Rapthor 14. Dez 2002 11:33

Ach und diese Index-Erstellung dient nur der schnelleren Sortierung? Oder ermöglicht mir die auch die Speicherung der sortierten Tabelle? :?

MrSpock 14. Dez 2002 20:16

Hallo Rapthor,

Indices dienen tatsächlich nur dazu, die Daten sortiert anzuzeigen, die physikalische Reihenfolge bleibt davon unberührt. Wählst du aber einen Index aus und läufst z.B. mit:

Delphi-Quellcode:
  myTable.First;

  while NOT myTable.EOF do
  begin
    ...
    myTable.Next
  end;
durch die Tabelle, erhälst du die Daten auch sortiert nach dem Index!

Aber nochmal: Insert in Verbindung mit SELECT speichert die Daten sortiert.

Hansa 14. Dez 2002 20:31

Hi,

Zitat:

, erhälst du die Daten auch sortiert nach dem Index!
Moment : Nach welchem ? :!: Woher soll der Rechner wissen, wie er sortieren soll :?: Du mußt doch den Index irgendwo angeben, oder nicht ? Es wäre schön, Du würdest mir ein Beispiel geben. Wo wir schon dabei sind : Was ich noch nicht so durchschaut habe ist folgendes : WHERE-Klausel und Indices. ALSO : wie wirkt sich das aus, wenn ein in der WHERE Klausel benutzter Begriff einen Index hat oder nicht und umgekehrt ?

Gruß
Hansa

MrSpock 14. Dez 2002 20:57

Hallo Hansa,

Indices kannst du nur Tabellen, nicht aber TQueries zuordnen. Einen aus den vorhandenen Indices einer Tabelle kannst du det TTable Eigenschaft IndexNames zuordnen:

Delphi-Quellcode:
  tabPersonen.IndexNames := 'idxNachOrten';
Du kannst aber auch IndexFieldNames verwenden.

Die WHERE Klausel gehört zu SQL, dient aber zur Beschränkung einer Auswahl und ist somit eher das Gegenstück zum Filter einer Tabelle. Zum Sortieren benutzt du die ORDER BY Klausel. Zum Einfügen einer Datenmenge in eine Tabelle nutzt du das INSERT Statement.

fiasko 14. Dez 2002 23:28

Hallo,

Zitat:

Zitat von MrSpock
Indices dienen tatsächlich nur dazu, die Daten sortiert anzuzeigen, die

Na das stimmt ja so nicht ganz. Die dienen vorallem als Unterscheidungsmerkmal zwischen den Datensätzen. Ohne Index ist es möglich, mehrere gleiche Einträge zu haben (auch wenn's dann eigentlich keine Mengen mehr sind). Wenn die DB aber ein Index hat, kann schnell beim einfügen geprüft werden, ob der Eintrag eineindeutig ist und evtl. blockiert werden.

Zitat:

Zitat von MrSpock
physikalische Reihenfolge bleibt davon unberührt.

Also die physikalische Reihenfolge ist wohl Sache des Betriebssystems und die logische des Datenbanktreibers und alles ne große Blackbox. Bei Paradox 7 wird die Sortierung einfach über Sekundärindizes bei jeder Veränderung am DB-Inhalt mit gepflegt und kann damit auch für das ursprüngliche Problem eingesetzt werden. Allerdings hab ich das vor langer Zeit mal mit Delphi 1 gemacht...


Thomas

MrSpock 15. Dez 2002 15:57

Hallo fiasko,

Zitat:

Na das stimmt ja so nicht ganz. Die dienen vorallem als Unterscheidungsmerkmal zwischen den Datensätzen. Ohne Index ist es möglich, mehrere gleiche Einträge zu haben...
Nur eindeutige (unique) Indices verhindern die Mehrfacheingabe. Primärindices müssen eindeutig sein, aber gerade Sekundärindices sind häufig nicht eindeutig und verhindern so zum Glück nicht die Eingabe eines gleichen Wertes. :mrgreen:

fiasko 15. Dez 2002 17:01

Hallo MrSpock

Zitat:

Zitat von MrSpock
Nur eindeutige (unique) Indices verhindern die Mehrfacheingabe. Primärindices müssen eindeutig sein, aber gerade Sekundärindices sind häufig nicht eindeutig und verhindern so zum Glück nicht die Eingabe eines gleichen Wertes.

Hab ich ja auch nirgends geschrieben, sonst wäre es ja auch sinnlos zwischen Primären und Sekundären Indizes zu unterscheiden. :mrgreen::mrgreen::mrgreen:

sol_e_sombre 17. Dez 2002 13:22

Hallo Rapthor!

Es gibt bei der TQuery die Eigenschaft "RequestLive" die muß auf True stehen, dann bekommst Du eine aktualisierbare Datenmenge zurück. Das müsste Dein Problem lösen, die Daten nach dem sortieren nicht mehr editieren zu können!

Rapthor 19. Dez 2002 07:22

Laut Delphi-Hilfe funktioniert RequestLive zur Rücklieferung BEARBEITBARER Ergebnismengen, wenn die SQL Anweisung mit der ORDER BY Klausel auf der Sortierung mit Index basiert.
Da meine Sortierung jedoch OHNE Index funktioniert scheint hier der Grund gegeben zu sein, warum ich RequestLive NICHT anwenden kann.
Jetzt ergibt sich für mich die Frage, wie ich die Sortierung mit Indexerstellung fertigbringe.
Kann mir da jemand eine Schritt-für-Schritt-Anleitung geben?
Ich hoffe dann nämlich die RequestLive Funktion nutzen zu können ...... :o
Ich habe zu danken

MrSpock 19. Dez 2002 07:45

Hallo Rapthor,

diese Einschränkung ist mir neu, aber man lernt ja nie aus...

Hintergrund scheint zu sein, dass bei Einfügen eines neuen Datensatzes aufgrund des fehlenden Indexes eine korrekte Einsortierung des neuen Datensatzes nicht möglich ist. Also bleibt doch nur der Weg, bereits bei der Definition der Tabelle einen (Sekundär-)Index anzulegen, dann brauchst du aber auch kein Select-Statement in einer TQuery Komponente, sondern kannst wie ich schon einmal beschrieben habe, einfach den Index auswählen. Du hattest ja ganz am Anfang sowieso SELECT * verwendet, also alle Felder ausgewählt.

Rapthor 19. Dez 2002 07:55

Gut, einen Index erstellen :D
Und wie/wo geht das? Ich bin da leider total der Laie und müsste wissen unter welchen Menüpunkten ich das machen kann. Tut mir Leid wenn ich damit schon nerve ..... :oops:

Rapthor 19. Dez 2002 08:39

Gut also Indexerstellung hab ich jetzt erledigt...undzwar mithilfe der Datenbankoberfläche (ein Extraprogramm des Delphipakets).Sortieren klappt und nen neuen Datensatz hinzuzufügen klappt jetzt nach der Sortierung auch. ALLERDINGS funktioniert es dann wieder NICHT eine erneute Sortierung nach Index vorzunehmen.
D.h. nach dem ersten Hinzufügen sind die Indexdinger nutzlos und eine Sortierung kann nicht durchgeführt werden.

Zitat:

"Index nicht mehr gültig!"
Gibt's ne Möglichkeit das zu verhindern?

MrSpock 19. Dez 2002 08:55

Hallo Rapthor,

das mit der DB - Oberfläche war goldrichtig! Hast du den Index als "gewartet" (Optioonsfeld bei der Definition des Indexes) definiert?


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