![]() |
Datenbank: Postgres • Version: 9.1 • Zugriff über: Delphi
Query kopieren und Zeilen löschen
Bei einer Abfrage über mehrere Tabellen mit FULL OUTER JOIN kann es zu doppelten Spaltenwerten kommen. Diese Query füttert eine DBGrid und dort sollen diese Zeilen ausgefiltert werden.
Meine Idee: Ich lade mir eine tempQuery und bearbeite diese. Danach kopiere ich sie in die eigentliche Query. Ist das so machbar? Falls ja, dann stellen sich für mich folgende Fragen. Wie kann man eine Query am einfachsten kopieren? Wie kann man eine Zeile aus der Query löschen, oder aus einer anderen Kopie zufügen? Wie gesagt, die Queries sind vom Aufbau her identisch. Scheinbar ist diese Vorgehensweise vollkommen ungewöhnlich, da ich beim googlen nichts darüber finden konnte. |
AW: Query kopieren und Zeilen löschen
Mmh, die Beschreibung klingt seltsam, kann mir vorstellen, dass es da bei google nichts zu holen gibt.
Zuallererst: Wie wär es denn, die Query so zu schreiben, dass keine doppelten Spaltenwerte ausgeworfen werden. Dann: Eine Query enthält den Abfragetext (SQL) und beim Öffnen der Abfrage wird ein Dataset erzeugt (Ergebnis) Was davon willst Du kopieren und bearbeiten? Falls Du ernsthaft ein unpassendes Ergebnis zurechtfiltern willst. Mit SQL geht das sicher besser. |
AW: Query kopieren und Zeilen löschen
Das Dataset möchte ich bearbeiten, oder komplett kopieren.
Geht das auch zeilenweise? Mein Problem. Ich brauche fast alle Infos aus mehreren Tabellen. Verbunden werden die durch eine/zwei ID's. In den Tabellen kann diese ID allerdings potentiell mehrfach vorkommen. Daher bekomme ich potentiell mehrere Ergebnisse für diese ID. Das ist ja ok. Ein Group By mit Postgres ist echt aufwendig. Daher ist diese Lösung eventuell ein Weg? Das Ergebnis des SQL liefert mir z.B. 4 Ergebnisse für die gleiche ID. Diese werden dann in der DBGrid angezeigt. Ich möchte dort aber nur ein Ergebnis. DISTINCT hilft nicht, da die Datensätze unterschiedlich sind. |
AW: Query kopieren und Zeilen löschen
Ich denke deine Lösungsansatz ist nicht ganz der richtige Weg. Versuche die SQL-Abfrage so zu gestalten, dass sie dir genau das liefert was du haben möchtest. Es gibt hier genügend SQL-Experten, die dir dabei gerne helfen.
|
AW: Query kopieren und Zeilen löschen
Zitat:
Code:
Zu deiner Idee und warum niemand mMn darauf eingeht:
Select Distinct * From (Deine bisheriges SQl)
a) es ist glaub ich nicht klar worauf die hinauswillst b) du solltest glaub ich bestimmte Datensätze aus deinem Ergebnis rausfiltern (die die du nicht brauchst) willst aber stattdessen den anderen Weg gehen und die Datensätze, die du brauchst aus dem Ergebnis raus in ein anderes Grid beispielsweise kopieren. Das ist doch viel zu aufwendig und kompliziert, weswegen jeder hier vorschlägt doch einfach direkt die Ergebnisdatenmenge einzuschränken. Und auch wenn das deiner Meinung nach vllt. nicht geht, ist es vllt. mit Hilfe des Forums doch möglich, wir bräuchten nur mehr Infos dazu. Denn generell, wenn du deiner Lösung folgen würdest müsstest du doch auch die "brauchbaren" Datensätze irgendwie identifizieren können. Und diese Kriterien kann man doch sicher auch schon vorher im SQL unterbringen. |
AW: Query kopieren und Zeilen löschen
1. Lade die Daten per normalem TQuery (oder was auch immer Du dafür verwendest)
2. Nimm ein TClientDataset, falls Du es hast, oder ein TkbMemTable. Oder TdxMemData, wenn Du DevExpress hast. Das sind In-Memory Datasets. 3. Überführe nur die eindeutigen Datensätze. Zum schnellen Prüfen eignet sich eine Dictionary am besten. Aber wie schon alle vor mir gesagt haben: Mach es mit SQL. Das ist ein klassisches Problem, das z.B. mit Subselects oder Aggregaten (statt der JOINS) einfach zu lösen ist. Kann aber auch sein, das deine Query einfach 'falsch herum ist'. Das wäre dann aber ein LEFT/RIGHT JOIN, was Du offenbar nicht hast. Zeig den SQL-Code und dein spezifisches Problem (also Beispieldaten) und dir kann geholfen werden. |
AW: Query kopieren und Zeilen löschen
Was mich interessieren würde ist einfach:
Kann man den Inhalt einer Query auf eine andere übertragen? Geht so etwas wie: ZQueryTemp:= ZQuery ?? |
AW: Query kopieren und Zeilen löschen
Na klar
Delphi-Quellcode:
ist aber wohl nicht was Du erreichen willst.
Query1.SQL.Text:=Query2.SQL.Text
Wie wäre es wenn du mal eine Tabellenbeschreibung und eine Beschreibung des gewünschten Ergebnisses posten würdest? Gruß K-H |
AW: Query kopieren und Zeilen löschen
Zitat:
So sollte das funktionieren:
Delphi-Quellcode:
(Getippt und nicht getestet)
Procedure AppendDataset(aSource, aDestination : TDataSet);
Var bookmark : TBookmark; Procedure _AppendRow(); Var field,dest : TField; Begin aDestination.Append; For field in aSource.Fields do begin dest := aDestination.FindField(field.FieldName); if dest <> nil then dest.Value = field.Value; end; aDestination.Post; End; Begin bookmark = aSource.GetBookmark; aSource.DisableControls; Try aSource.First; while not aSource.Eof do begin _AppendRow(); aSource.Next; end; Finally aSource.GotoBookmark(bookmark); aSource.FreeBookmark(bookmark); aSource.EnableControls; End; End; DAs ist natürlich so nicht das schnellste, weil jedes Mal 'FindField' aufgerufen wird. Wenn man sich das in einer Dictionary merkt, wird das viel flotter. Zudem sollte man wissen, das bei einem TDataset, welches an eine Datenbank gebunden ist, die neuen Zeilen sofort persitiert werden. |
AW: Query kopieren und Zeilen löschen
Ich hab letztens mal eine FireDac Demo gesehen. Da sah das so aus, als könnte man damit das Ergebnis einer Query als Basisdatenmenge für eine weitere Query nutzen, das könnte vllt. dann sowas sein.
Wobei auch ich mich den Vorrednern anschließe, dass das sicher (mit dem richtigen SQL-Statement) auch einfacher geht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:24 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