carroll: SQL JOIN auf selbe Tabelle

Hallo,

ich habe hier eine Tabelle (Addressdaten ca. 6000 Einträge), die ich gern etwas filtern will, um Quasi-Dopplungen herauszufinden. Es gibt also ab und zu mehrere Einträge zu einer Firma (COMPANY1) mit z.b. verschiedenen Adressen (hier mal die Straße STREET0 als Beispiel).

Ich möchte also in meiner Abfrage alle Datensätze angezeigt bekommen, bei denen der Firmenname schonmal vorkam, aber eine andere Straße vorhanden ist.

Das soweit meine Abfrage:

SELECT DISTINCT ADDRESSES.* FROM ADDRESSES LEFT OUTER JOIN ADDRESSES AS ADDRESSES_1 ON ADDRESSES.COMPANY1 = ADDRESSES_1.COMPANY1 WHERE ADDRESSES.STREET0 <> ADDRESSES_1.STREET0

Ohne DISTINCT erhält man über 8000 Ergebnisse, was natürlich wenig Sinn macht, aber mir einleuchtet - schließlich wird Die Tabelle auf sich selbst abgebildet.
Mit DISTINCT sind es nur noch gut 1200 Ergebnisse, sieht also schon recht gut aus.

Meine Frage an jemand, der etwas mehr Einsicht in SQL hat: macht das Sinn? Irgendwie ist mir bei DISTINCT etwas unwohl, aber ich sehe keinen anderen Weg die ganzen normalen Einträge rauszufiltern.

  1. Hallo carroll,

    ich denke GROUP BY sollte dir dabei helfen

    in etwa :
    SELECT company, street0
    FROM ADRESSES
    GROUP BY company
    HAVING count(street0) > 1

    die SQL syntax müsstest du nochmal genauer nachforschen, aber diese Abfrage sollte dir das gewünschte Ergebnis liefern.

    Zur erklärung

    Group by gruppiert nach den Companynamen
    Having bezieht sich auf das Group by und sollte dir alle datensätze ausgeben, welche mehr als eine strasse eingetragen haben.

    um in zukunft solche fehler auszuschließen, gibt es die möglichkeit eine Spalte als UNIQUE einzutragen.

    Gruß,
    Alex.

    1. Hallo carroll,

      ich denke GROUP BY sollte dir dabei helfen

      in etwa :
      SELECT company, street0
      FROM ADRESSES
      GROUP BY company
      HAVING count(street0) > 1

      die SQL syntax müsstest du nochmal genauer nachforschen, aber diese Abfrage sollte dir das gewünschte Ergebnis liefern.

      Danke, der Tip war sehr hilfreich! Etwas verändert und ich habe zumindest erstmal die Firmen, bei denen mehrere Einträge mit Straßen existieren:

      SELECT ADDRESSES.COMPANY1, COUNT(ADDRESSES.STREET0)  
      FROM ADDRESSES  
      GROUP BY ADDRESSES.COMPANY1  
      HAVING COUNT(ADDRESSES.STREET0) > 1;
      

      Zur erklärung

      Group by gruppiert nach den Companynamen
      Having bezieht sich auf das Group by und sollte dir alle datensätze ausgeben, welche mehr als eine strasse eingetragen haben.

      um in zukunft solche fehler auszuschließen, gibt es die möglichkeit eine Spalte als UNIQUE einzutragen.

      Es handelt sich um die Datenbank aus "Cobra Adress Plus", welche nun eben schon eine ganze Weile eher 'wild' gewachsen ist und ich fürchte, dass selbst diese kleinen Versuche da noch etwas Ordnung reinzubringen nicht sehr aussichtsreich sind. ;)

      Gruß,
      Alex.

      Nochmals vielen Dank!

      carroll

    2. yo,

      SELECT company, street0
      FROM ADRESSES
      GROUP BY company
      HAVING count(street0) > 1

      jedes vernünftige dbms gibt hier ein fehlermeldung aus, da die gruppierung nicht richtig angewandt wurde. ich vermute, du arbeitest mit mysql.

      Ilja

      1. jedes vernünftige dbms gibt hier ein fehlermeldung aus, da die gruppierung nicht richtig angewandt wurde. ich vermute, du arbeitest mit mysql.

        Die Syntax war natürlich noch nicht i.o., aber das hat Alex ja schon anklingen lassen.

        Ich habe die Datenbank momentan nur mal schnell im Access offen, da Cobra Adress Plus nicht wirklich per SQL abfragen lässt.