![]() |
Problem mit distinct
Hallo,
ich habe eine FB-Tabelle mit den Feldern ID, RechNr, KundenNr, ArikelNr. Leider mit doppelten Einträgen der Rechnr und KundenNr. Nun soll nur die ID und RechNr ohne Duplikate ausgegeben werden. Mit
SQL-Code:
geht es nicht.
select distinct RechNr, ID from tabelle
Wer hat eine Idee? |
Re: Problem mit distinct
hallo rolf!
rein aus dem bauch heraus würde ich es so versuchen:
Delphi-Quellcode:
alle angaben ohne gewähr ;)
select distinct RechNr, distinct ID from tabelle
mfg, stefan |
Re: Problem mit distinct
Hi Stefan,
leider nicht. :shock: |
Re: Problem mit distinct
Vielleicht so:
SQL-Code:
Sorry, ist nur geraten :cat:
SELECT (DISTINCT rechnr), (DISTINCT ID) FROM table
|
Re: Problem mit distinct
Dein Code ist doch vollkommen richtig.
Mit Distinct sorgst du dafür, dass jede Zeile nur einmal vorkommt. Es werden werden also keine doppelten Paare von RechNr & ID ausgegeben. p.s.:
SQL-Code:
... tut irgendwie weh ;)
SELECT distinct RechNr, distinct ...
|
Re: Problem mit distinct
Liste der Anhänge anzeigen (Anzahl: 1)
Habe ich auch gedacht.
Aber das Ergebnis siehe Bild. :gruebel: |
Re: Problem mit distinct
Hai Rolf Rostig,
mit distinct wird doch nur verhindert das doppelte Einträge angezeit werden. in deiner Liste gibt es aber keine doppelten paare von RechNr, ID. Wenn ich dich richtig verstehe möchtest Du ja eine Abfrage die alle RechNr anzeigt die genau einmal in der Tabelle vergeben sind oder? |
Re: Problem mit distinct
ja genau :hi:
|
Re: Problem mit distinct
Hallo Rolf!
Ist das Feld "ID" auch der Primär-Key in Deiner Tabelle? Wenn ja (was ich auch vermute), dann hat die Klausel "DISTINCT" keine Wirkung in Deiner Abfrage, weil "ID" schon per Definition eindeutig ist (es können keine doppelten Einträge von ID existieren). Deshalb können auch keine doppelten Paare von "RechNr" und "ID" vorkommen. Wenn Du alle RechNr selektieren willst, die in deiner Tabelle nur genau einmal vorkommen, solltest Du die "GROUP BY" und "HAVING" Klausel verwenden. Ich würde das etwa so machen:
SQL-Code:
Viele Grüße
select RechNr
from tabelle group by RechNr having count(*) = 1 Markus |
Re: Problem mit distinct
Zitat:
Du gruppierst nach RechNr. Da du nur RechNr auswählst entspricht es exakt einem...
SQL-Code:
...oder...
SELECT Distinct RechNr
FROM tabelle
SQL-Code:
Das zusätzlich Count(*) = 1 in der HAVING Clause erfordert doch nur unnötigerweise einen weiteren Durchlauf der Daten.
SELECT RechNr
FROM tabelle GROUP BY RechNr |
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 14:18 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