AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Problem mit distinct
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit distinct

Ein Thema von Rolf Rostig · begonnen am 10. Apr 2004 · letzter Beitrag vom 17. Apr 2004
Antwort Antwort
Seite 2 von 2     12   
MarkusB

Registriert seit: 3. Apr 2004
Ort: Hamburg
105 Beiträge
 
#11

Re: Problem mit distinct

  Alt 12. Apr 2004, 12:31
Hi Robert!

SQL-Code:
select RechNr
from tabelle
group by RechNr
having count(*) = 1
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(*))
besagt wie viele Records sich in jeder Gruppe befinden.

Also noch mal meine Überlegung:
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
  Mit Zitat antworten Zitat
Rolf Rostig

Registriert seit: 5. Mär 2003
Ort: Stade
117 Beiträge
 
Delphi 7 Professional
 
#12

Re: Problem mit distinct

  Alt 12. Apr 2004, 13:27
Hallo,

Ziel des Ganzen: die doppelten Einträge löschen.
Gruss
Rolf
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#13

Re: Problem mit distinct

  Alt 12. Apr 2004, 13:51
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:
SELECT RechNr, min(ID)
FROM Tabelle
GROUP BY RechNR
@Markus
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.
  Mit Zitat antworten Zitat
MarkusB

Registriert seit: 3. Apr 2004
Ort: Hamburg
105 Beiträge
 
#14

Re: Problem mit distinct

  Alt 12. Apr 2004, 17:53
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:
select RechNr
from tabelle
group by RechNr
having count(*) = 1
liefert die Antwort auf die Aufgabestellung die von Sharky formuliert wurde:
Zitat:
Wenn ich dich richtig verstehe möchtest Du ja eine Abfrage die alle RechNr anzeigt die genau einmal in der Tabelle vergeben sind oder?
Zurückgelieferte Datenmenge siehe Anhang: Datei Query1.jpg
Wobei ich meine, dass having count(*) = 1 das "A&O" der Abfrage ist.

Deine Abfrage:
SQL-Code:
SELECT RechNr, min(ID)
FROM Tabelle
GROUP BY RechNR
liefert die Antwort auf die folgende Aufgabestellung:
"Zeige DIE niedrigste ID pro RechNr"

Also nicht
Zitat:
Willst du unbedingt EINE von vielen IDs einer RechNr haben
Zurückgelieferte Datenmenge siehe Anhang: Datei Query2.jpg

Als Datenmenge für beide Queries dient die von Rolf zur Verfügung gestellte Tabelle
siehe Anhang: Datei Tabelle.jpg

Viele Grüße
Markus
Miniaturansicht angehängter Grafiken
query2.jpg   tabelle_643.jpg  
Angehängte Grafiken
 
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#15

Re: Problem mit distinct

  Alt 12. Apr 2004, 18:16
Verdammt
Du hast natürlich vollkommen recht. Ich hatte das Problem falsch verstanden.
Sorry, dass ich so einen Käse verzapft habe.
  Mit Zitat antworten Zitat
Rolf Rostig

Registriert seit: 5. Mär 2003
Ort: Stade
117 Beiträge
 
Delphi 7 Professional
 
#16

Re: Problem mit distinct

  Alt 14. Apr 2004, 12:32
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.
Gruss
Rolf
  Mit Zitat antworten Zitat
MarkusB

Registriert seit: 3. Apr 2004
Ort: Hamburg
105 Beiträge
 
#17

Re: Problem mit distinct

  Alt 15. Apr 2004, 23:34
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:
delete from tabelle
where id not in (select max(id)
                   from tabelle
               group by rechnr)
B. ein Versuch der allgemeinen Lösung:
Delphi-Quellcode:
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;
Sag bescheid ob es geklappt hat....
An einer eleganteren Lösung (SQL) wäre ich auch interessiert.

Viele Grüße
Markus
  Mit Zitat antworten Zitat
Rolf Rostig

Registriert seit: 5. Mär 2003
Ort: Stade
117 Beiträge
 
Delphi 7 Professional
 
#18

Re: Problem mit distinct

  Alt 17. Apr 2004, 16:45
Hi Markus,

ja, mit der Version A hat es schon geklappt.
Vielen Dank für die Hilfe.
Gruss
Rolf
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 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