Datenbank Abfrage Problem



  • Mahlzeit,

    hab ein kleines Problemchen ^^

    und zwar hab ich eine Access Datenbank wo ich freunde mit Telefonnummer, Adresse, Ort etc eingespeichert habe!
    Jetzt ist es so das xyz personen in Berlin wohnen und zyx leute in münchen wenn ich jetzt die orte ausgebe seht x mal berlin drin und x mal münchen ich möchte die ortschaft aber lediglich einmal ausgeben..

    mein ansatz war der hier

    "SELECT Ort FROM freunde"
    

    was ja auch einwandfrei funktioniert bloß das es eben doppelte dreifache einträge gibt die ich gar nicht haben möchte!

    Habt ihr vielleicht eine Idee?
    thx im voraus



  • SELECT Ort
    FROM   freunde
    GROUP BY Ort
    

    Mit Order By bekommst Du auch ne schöne sortierte Ausgabe 😉



  • Airdamn schrieb:

    SELECT Ort
    FROM   freunde
    GROUP BY Ort
    

    Mit Order By bekommst Du auch ne schöne sortierte Ausgabe 😉

    Ich hätte als erstes an SELECT DISTINCT Ort FROM Freunde gedacht. Gibt es einen bestimmten Grund, warum Du GROUP BY verwendest?



  • Joe_M. schrieb:

    Airdamn schrieb:

    SELECT Ort
    FROM   freunde
    GROUP BY Ort
    

    Mit Order By bekommst Du auch ne schöne sortierte Ausgabe 😉

    Ich hätte als erstes an SELECT DISTINCT Ort FROM Freunde gedacht. Gibt es einen bestimmten Grund, warum Du GROUP BY verwendest?

    Ich war der Meinung, dass Access kein DISTINCT kennt.
    In diesem Fall könnte man tatsächlich das so machen, wie Du es sagst.
    Was Access nicht kennt war count( distinct feld )...



  • Ich habe mal gehört, dass distinct sehr langsam ist... ?!?



  • ich hab nicht mal was von distinct gehört 😮

    was is des? 😉

    ok habs mal mit distinct gemacht selbes ergebnis, ungefähr gleiche zeit!

    jetzt hab ich ein anderes Problem weiß nicht ob das noch hierher gehört aber was mach ich den wenn ich das ganze im Builder über eine ListBox per Schleife ausgeben will? Da kümmt doch den 3x der gleiche wert wieder...



  • unter Verwendung der bisher genannten SQl-Abfragen (distinct, group by) sollte das aber nicht passieren

    was genau hast du denn versucht zu tun?



  • ok also hier als erstes mal der Quelltext:

    t_orte->Active = true;
     ds_orte->DataSet->First();
     lb_orte->Clear();
     AnsiString orte;
    
     q_orte->Close();
     q_orte->SQL->Clear();
     q_orte->SQL->Add("SELECT DISTINCT Ort FROM freunde");
     q_orte->Open();
     q_orte->First();
    
      for (int i=0;i<q_orte->RecordCount;i++)
        {
        orte = q_orte->FieldByName("Ort")->AsString;
        lb_orte->Items->Add(orte);
        t_orte->Next();
        }
    
     t_orte->Close();
    

    Also er geht die Schleife dreimal durch da drei verschiedene Orte gefunden wurden soweit so gut, bloß in der ListBox erscheint 3x der gleiche Ort...



  • ist t_orte == q_orte?



  • ahhhhhhh blöde flüchtigkeitsfehler danke das war der ausschlaggebende punkt 🙂



  • Noch eine Anmerkung: Die Schleife über den RecordCount zu bilden ist nicht so elegant. In diesem Fall ist es nicht tragisch, aber wenn die Abfragen komplexer und/oder die Tabellen größer werden, kann ein solcher RecordCount ziemlich lange dauern.

    Du solltest für solche Fälle lieber ein do / while Konstrukt verwenden und die Abbruchbedingung von TQuery::EOF oder TQuery::FindNext() abhängig machen.


Anmelden zum Antworten