![]() |
Re: Problem mit distinct
Hi Robert!
SQL-Code:
Der Code durchläuft die Tabelle und gruppiert (sammelt) alle Datensätze mit der gleichen RechNr (es kann sein, dass sie doppelt oder mehrfach vorkommen – siehe Rolfs Problembeschreibung) in getrennte Gruppen. Dabei wird für jede Gruppe ein Zähler geführt. Der Zähler (COUNT(*))
select RechNr
from tabelle group by RechNr having count(*) = 1 besagt wie viele Records sich in jeder Gruppe befinden. Also noch mal meine Überlegung: :gruebel: 1. Tabelle auslesen. 2. Alle Records nach RechNr gruppieren. 3. Untersuchen wie viele Records sich in jeder Gruppe befinden. 4. Nur die RechNr ausgeben, die nur einmal vorkommen (COUNT(*) = 1) Ich hoffe, dass ich das Problem von Rolf richtig verstanden habe. Viele Grüße Markus |
Re: Problem mit distinct
Hallo,
Ziel des Ganzen: die doppelten Einträge löschen. |
Re: Problem mit distinct
Es wurde doch schon mehrfach gepostet, warum du doppelte Einträge bekommst, wenn du die ID mit selektierst.
Willst du unbedingt EINE von vielen IDs einer RechNr haben dann geht das nur so:
SQL-Code:
@Markus
SELECT RechNr, min(ID)
FROM Tabelle GROUP BY RechNR nochmal: Das Count(*) = 1 in der Having-Clause hat keinen Sinn, denn wenn du NUR nach RechNr gruppierst, dann bekommst du auch nur EINE RechNr. |
Re: Problem mit distinct
Liste der Anhänge anzeigen (Anzahl: 3)
Hi Rolf!
Jetzt wo die Aufgabestellung immer klarer wird, habe ich noch eine Frage. Welcher Datensatz (von denen mit der gleichen RechNr) soll in der Tabelle bleiben? Der mit der niedrigsten ID, der mit höchsten ID, der mit irgendeiner ID oder sollen sogar alle als fehlerhaft angesehen und deswegen komplett aus der Tabelle entfernt werden? @Robert Meine Abfrage:
SQL-Code:
liefert die Antwort auf die Aufgabestellung die von Sharky formuliert wurde:
select RechNr
from tabelle group by RechNr having count(*) = 1 Zitat:
Wobei ich meine, dass
SQL-Code:
das "A&O" der Abfrage ist.
having count(*) = 1
Deine Abfrage:
SQL-Code:
liefert die Antwort auf die folgende Aufgabestellung:
SELECT RechNr, min(ID)
FROM Tabelle GROUP BY RechNR "Zeige DIE niedrigste ID pro RechNr" Also nicht Zitat:
Als Datenmenge für beide Queries dient die von Rolf zur Verfügung gestellte Tabelle siehe Anhang: Datei Tabelle.jpg Viele Grüße Markus :gruebel: |
Re: Problem mit distinct
Verdammt :wall:
Du hast natürlich vollkommen recht. Ich hatte das Problem falsch verstanden. Sorry, dass ich so einen Käse verzapft habe. :oops: |
Re: Problem mit distinct
Hi Markus,
es ist völlig egal welcher von den doppelten Datensätzen gelöscht wird. Wichtig ist nur das die RechNr nur einmal vorkommt. Mit der vorgeschlagenen Lösung ist das auch der Fall. Jetzt muss ich nur noch die überflüssigen Datensätze löschen, aber das klappt noch nicht. |
Re: Problem mit distinct
Hi Rolf!
Um die doppelten Einträge der RechNr aus Deiner Tabelle zu löschen, schlage ich Dir folgende Lösungen vor: A. SQL-Anweisung: Kurz und knackig, aber sie funktioniert NUR wenn die „id“ in der Tabelle eindeutig ist:
SQL-Code:
B. ein Versuch der allgemeinen Lösung:
delete from tabelle
where id not in (select max(id) from tabelle group by rechnr)
Delphi-Quellcode:
Sag bescheid ob es geklappt hat....
procedure my_procedure();
var my_query: TQuery; begin my_query := TQuery.Create(self); my_query.SQL.Add('select rechnr, max(id) as max_id from test003 group by rechnr'); my_query.Prepare; my_query.Open; if my_query.RecordCount <> 0 then begin Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('delete from test003'); Query1.SQL.Add('where rechnr = :rechnr'); Query1.SQL.Add(' and id <> :id'); my_query.first; while not my_query.EOF do begin Query1.ParamByName('rechnr').Value := my_query.FieldbyName('rechnr').AsString; Query1.ParamByName('id').Value := my_query.FieldbyName('max_id').AsInteger; Query1.ExecSQL; my_query.next; end; end; my_query.Close; my_query.Destroy; end; An einer eleganteren Lösung (SQL) wäre ich auch interessiert. Viele Grüße Markus :gruebel: |
Re: Problem mit distinct
Hi Markus,
ja, mit der Version A hat es schon geklappt. Vielen Dank für die Hilfe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:51 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