Überprüfung welche ID's einer anderen ID zugeteilt sind

Butterblume

Benutzer
Beiträge
13
Hallo ihr Lieben,

ich sitze seit zwei Tagen an einem Problem, das ich nicht gelöst bekomme.

Ich habe eine Tabelle, in der Adressen von Firmen "verlinkt" sind. Die Firmen sind in einer Spalte, namens FirmaID, als ID's gespeichert und die Adressen sind auch in Form von ID's, in einer Spalte namens AdressenID, gespeichert.

Meine Aufgabe ist es zu überprüfen, welche Firmen ID's mehrmals vorkommen und welchen dieser Firmen ID's dann auch unterschiedliche Adressen zugewiesen sind. Z.B. könnte eine FirmenID mehrmals vorkommen, weil sie unter unterschiedlichen Adresstypen (z.B. Rechnungs- oder Lieferadresse) abgelegt ist. Aber dann muss ich diese FirmenID's noch darauf überprüfen, ob ihr unterschiedlichen Adressen zugeteilt sind. Z.B. Firma1 hat die Adresse1 als Lieferadresse und eine Adresse2 als Rechnungsadresse.

Ich habe bisher nur geschafft, dass mir die FirmenID's aufgelistet werden, die mehr als einmal vorkommen. Somit hätte ich schon die Firmen, denen potentiell auch unterschiedliche Adressen zugeteilt sein können, kann aber nicht wirklich darauf zugreifen.

Meine bisherige Abfrage sieht so aus:

SELECT FirmaID, COUNT(FirmaID) AS Mehrfacheinträge
FROM LinkAdressen
GROUP BY FirmaID
HAVING(COUNT(FirmaID) > 1)

Ich hoffe, dass ich mein Problem anschaulich beschreiben konnte und bin für jeden Tipp dankbar.
 
Werbung:
Du suchst wohl das hier, die Tabellen- und Spaltennamen sind jetzt geraten:
Code:
SELECT LinkAdressen.FirmaID,Adressen.Typ,COUNT(*) AS Anzahl_Einträge
FROM LinkAdressen
INNER JOIN Adressen ON LinkAdressen.AdresseID
GROUP BY LinkAdressen.FirmaID,Adressen.Typ
HAVING(COUNT(*) > 1
Adressen.Typ muss die Spalte sein, die vorgibt um welche Art von Adresse es sich handelt. Das kann auch anders abgebildet sein.
 
Hallo,

danke für die schnelle Antwort. Ich weiß nicht, ob ich mit einem Join weiterkomme, da ich nur mit der LinkAdressen Tabelle arbeiten soll und auch alles in ihr vorhanden ist. Soweit ich weiß, muss nach einem Join der ON irgendeinen Vergleich anstellen, aber da fehlt mir absolut die Idee, nach was ich vergleichen soll. Wenn ich die AdressenID mit der AdressenID aus einer anderen Tabelle (der Adressen Tabelle) vergleiche, bekomme ich ja alle wieder, deren ID's öfters vorkommen. So bekomme ich, falls ich die Adressen Tabelle verwende (die ich nicht verwenden soll) einige mehr, als mit meiner Abfrage. Soweit ich gesehen habe, werden dann sowohl die FirmenID's ausgegeben, die mehrmals vorkommen aber nicht unterschiedlichen AdressID's zugeteilt sind und diejenigen, die unterschiedlichen AdressID's zugeteilt sind...

Aber vielleicht stehe ich auch total auf dem Schlauch.
 
Also der JOIN hat bereits ein ON und das ist auch richtig. Deswegen liefert die der Join aber nicht mehr Ergebnisse, da bist du auf dem Holzweg.

Wo steht denn deine Information um was für eine Art von Adresse es sich handelt, in der LinkAdresse-Tabelle? Wie heißt die Spalte?
 
Guten Morgen,

ich hab es gestern nicht mehr geschafft zu antworten.

Ich merke gerade, dass ich mein Problem nicht gut genug erklärt habe.

Ich habe einen ganzen Satz an Tabellen, aber benutzen darf ich nur die LinkAdressen Tabelle. In ihr sind mehrere Spalten, die AdressenID, die FirmenID und der Adresstyp (und noch ganz viele andere, die aber unwichtig sind). Der Adresstyp ist pro Firma mehrfach drinnen. Das kann bedeuten, dass die Firmenadresse einmal als Rechnungs- oder Lieferadresse eingetragen ist. Aber sie ist auch immer unter dem Adresstyp NULL drinnen, unabhängig davon, ob sie unter irgendeinem Typen abgelegt ist. Die Maske, die auf diese Tabelle zugreift, hat mehrere Haken für die Adressfelder. Wenn jemand also eine Adresse einträgt, und bei ihr mehrere Haken setzt, dann ist diese Adresse der Firma in mehreren Spalten zugewiesen. Unter den jeweiligen Adresstypen und immer einmal als Adresstyp NULL.

Daher habe ich gedacht, dass man den Typen erst einmal komplett ausblendet und nur die Adressen nimmt, bei denen auch der Typ auf NULL steht. Weil somit hat man schon einige Dupletten rausgefiltert. Dann müsste ich nur noch herausfinden, wie ich es schaffe, mir eine SELECT Abfrage zu formulieren, die mir dann nur die AdressID's und die FirmenID's auflistet, die mehrmals drinnen sind und für die auch unterschiedliche Adressen eingetragen sind.

Sinn des Ganzen ist, dass ich überprüfen muss, ob einer Firma unterschiedliche Adressen zugewiesen sind. Falls nicht, können nur die Adressen behalten werden, die als Adresstyp NULL haben, weil keine Adressen verloren gehen. Wenn aber doch einer Firma unterschiedliche Adressen zugewiesen sind und ich lösch die einfach, wäre das natürlich nicht schön...

Ich hoffe, dass meine Überlegung soweit in die richtige Richtung geht und ich die Tabelle diesmal richtig erklären konnte.
 
Also der Reihe nach.
Code:
SELECT FirmaID,Adresstyp,COUNT(*) AS Anzahl_Einträge
FROM LinkAdressen
GROUP BY FirmaID,Adresstyp
HAVING COUNT(*) > 1
Dieser Code liefert dir eine Liste mit doppelten Adresstypen bei einer Firma. Gibt es mehrere Adressen unterschiedlichen Typs werden diese nicht berücksichtigt, ich denke mal das ist erstmal das was du brauchst.

Das mit dem Adresstyp = NULL verstehe ich noch nicht ganz.
Gibt es jetzt immer einen Adresstyp mit NULL oder kann es einen Adresstyp NULL nur geben wenn kein Haken gesetzt wurde? Am besten du postest mal ein paar Beispiele, falls der Code oben nicht schon das gewünschte Ergebnis liefert. Am besten zu einer FirmenID, die nicht in der Liste steht aber drin sein sollte.
 
Ja, genau. Das ist ja so ähnlich wie das, was ich auch schon hatte. Allerdings fehlt in dieser Liste die Übersicht... Aber erst einmal beantworte ich deine Frage.

Also eine AdressID hat immer auch den Adresstyp NULL. Auch dann, wenn ein oder mehrere Häkchen gesetzt worden sind. Daher hat man auch alle AdressID's wenn man:

SELECT AdressID, FirmaID, Adresstyp
FROM LinkAdressen
WHERE Adresstyp is null

eingibt - natürlich sind da immer noch einige doppelt, weil eine Firma mehrere Adressen haben kann. Bei GROUP BY ist das Problem, dass, wenn ich das mit der FirmenID mache, dass sie dann nicht mehr öfters auftaucht, sondern nur noch einmal.

Ich bräuchte eine Übersicht, mit zwei Spalten, einmal FirmaID und einmal AdressID. Und nur von denen, bei denen eine Firma unterschiedliche Adressen hat.

Bsp:

In der ersten Zeile ist die AdressID 1 und die FirmaID 1, in der zweiten Zeile ist die AdressID 2 und die FirmaID 1. Dieser Firma sind unterschiedliche Adressen hinterlegt. Dann kann natürlich auch sein, dass in der dritten Zeile die AdressID 1, die FirmaID1 ist, aber in der vierten Zeile ist die AdressID auch 1 und die FirmaID auch. Dieser Firma wäre dann zweimal dieselbe Adresse hinterlegt, daher brauche ich da nicht alle AdressID's.

Deshalb müsste die Übersicht dann auch mehrmals dieselbe FirmenID ausgeben, vorausgesetzt, in der benachbarten Spalte AdressID sind unterschiedliche ID's.
 
Ich hab etwas versucht, was eigentlich ganz gut aussieht.

SELECT FirmaID, AddressId, COUNT(*) As Anzahl_Einträge
FROM LinkAdressen
GROUP BY FirmaID, AddressId
HAVING COUNT(*) > 1
ORDER BY FirmaID

Nun ist mir aber aufgefallen, dass es auch FirmenID Felder mit NULL gibt... Dann ist wohl nur eine Adresse für einen Ansprechpartner der Firma hinterlegt. Kann ich da irgendwie reinbasteln, dass mir die NULL Felder nicht angezeigt werden? weil an ein HAVING kann ich ja kein IS NOT NULL ranhängen...
 
Du kannst mit WHERE FirmaID IS NOT NULL filtern. Also:
Code:
SELECT FirmaID, AddressId, COUNT(*) As Anzahl_Einträge
FROM LinkAdressen
WHERE FirmaID IS NOT NULL
GROUP BY FirmaID, AddressId
HAVING COUNT(*) > 1
ORDER BY FirmaID

Wenn es immer einen Datensatz mit Adresstyp NULL gibt dann solltest du diesen auch filtern:
Code:
SELECT FirmaID, AddressId, COUNT(*) As Anzahl_Einträge
FROM LinkAdressen
WHERE FirmaID IS NOT NULL
AND Adresstyp IS NOT NULL
GROUP BY FirmaID, AddressId
HAVING COUNT(*) > 1
ORDER BY FirmaID
 
Ich hab das jetzt mal ausprobiert.

Es sieht allerdings nicht so aus, wie ich es mir gedacht habe (natürlich kann meine Vorstellung auch falsch sein).

Das was raus kommen soll, soll die beiden Spalten FirmaID und AdressID besitzen. Und die Zeilen sollen so aufgebaut sein, dass ausschließlich die Firmen ID's gezeigt werden, die unterschiedliche(oder einmalige) Adressen haben. Allerdings nicht nur einmal und mit einer dritten Spalte, in der steht, wie oft etwas vorkommt.

Sondern in der Art:
Code:
FirmaID    |    AdressID
1                      1
1                      2
2                      4
3                      5

Ich hoffe, dass das irgendwie verständlich rüberkommt. Ich werde bei dieser Aufgabe immer wieder aufs Neue verwirrt...
 
Ich glaube, du musst mal Beispieldatensätze posten und das was raus kommen soll. Also alle Spalten und mehrere Datensätze zu verschiedenen FirmenIDs die teilweise im Ergebnis enthalten sind und teilweise nicht.
 
Okay. Ich hoffe, dass ich es richtig mache.

Das ist die Tabelle, wie sie ungefähr aussieht:
Die Spaltennamen sind vermutlich selbsterklärend. In der Gelöschtspalte ist eine 1 drinnen, wenn die Zeile über die Eingabemaske gelöscht wurde.


Code:
AdressID  |  FirmaID |  PersonID  |  Adresstyp  | Gelöscht
1            1          NULL         Rechnung     NULL
1            1          NULL         Liefer       NULL
1            1          NULL         Geschäftl    NULL
1            1          NULL         NULL         NULL
1            1          1            Privat       NULL
1            NULL       NULL         NULL         NULL
1            1          1            NULL         1                                
2            2          NULL         Liefer       NULL
2            2          NULL         NULL         NULL
3            2          NULL         Rechnung     NULL
3            2          NULL         NULL         NULL
4            3          7            Geschäftl    NULL
4            3          7            NULL         NULL
5            NULL       8            Privat       NULL
5            NULL       8            NULL         NULL

Und für das obige Beispiel sollte das hier rauskommen ( Die Gelöscht und PersonID müssen nicht zwangsläufig zu sehen, nur damit gesehen wird, nach welchen Kriterien ausgewählt werden sollte):

Code:
AdressID  |  FirmaID |  PersonID  |  Adresstyp  | Gelöscht
1            1          NULL         NULL         NULL                       
2            2          NULL         NULL         NULL
3            2          NULL         NULL         NULL
4            3          7            NULL         NULL
5            NULL       8            NULL         NULL

Hoffentlich war das hilfreich!
 
Okay die Ausgangsdaten sehen zwar etwas vermurkst aus aber soweit klar.

Ich verstehe aber die Zieltabelle noch nicht. Warum z.B. soll Adresse 4 ausgegeben werden wenn es doch zu jedem Adresstyp immer auch einen Eintrag mit NULL gibt, ist diese Adresse nicht einwandfrei? Das hatte ich bisher anders verstanden.

Hat deine LinkAdressen-Tabelle einen Primärschlüssel? Das wäre hilfreich.
 
Werbung:
Guten Morgen erstmal!

Ich weiß nicht so recht, was du meinst. Die Adresse 4 ist einwandfrei, weil sie einer Firma und/oder einer Person zugewiesen wird und auch nicht über die Eingabemaske gelöscht wurde. Ich möchte aus der Tabelle gerne alle Adressen haben, die eindeutig(wenn ihr Typ NULL ist), nicht gelöscht und einer Firma/Person zugeteilt sind. Sobald ich diese Abfrage habe, möchte ich anhand der Ausgabe (wie sie oben aussehen soll) eine neue Tabelle erstellen. Die Tabelle wird dann aus den Adressen, Firmen und Personen zusammengestellt, denen noch eine einwandfreie Adresse zugeteilt werden kann. Das dürfte für mich eigentlich kein Problem darstellen, sonder nur, diese Datensätze rauszufiltern. In der LinkAdressen Tabelle sind mehrere ID's (ich benutze erst seit kurzem MS SQL Server und der Ordner für Schlüssel ist jedoch leer...), ich vermute aber mal, dass es Fremdschlüssel sind, aus anderen Tabellen, wie z.B. Adresse, Firma, Person. Also die Abfrage, die ich suche, sollte nur einwandfreie AdressID's mit zugehörigen Firmen und Person ID's ausgeben. So wie die Beispiel-Zieltabelle oben.

Ich hoffe, dass ich deine Frage beantworten konnte.
 
Zurück
Oben