SQL JOIN auf selbe Tabelle
carroll
- datenbank
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.
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.
Hallo carroll,
ich denke GROUP BY sollte dir dabei helfen
in etwa :
SELECT company, street0
FROM ADRESSES
GROUP BY company
HAVING count(street0) > 1die 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
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
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.