2016-12-23 2 views
1

Ich habe nur die Spalten in meiner Tabelle enthalten, die sich ziemlich auf diese beziehen, also bitte über die fehlenden Spalten in Benutzer- und Adresstabellen.JOIN-Anweisung oder ein anderer Ansatz

Um einen kurzen Überblick über das System zu geben. Der "Distributor" ist hier die Hauptverbindung, sie sind an der Spitze des Rollenbaums. Um einen Manager zu erstellen, müssen Sie sie an einen Verteiler binden, daher die DistributorManagerRelationship-Tabelle. Wenn ein Repräsentant erstellt wird, muss er an einen Manager gebunden sein, und dieser Manager kann nur ein Manager sein, der dem ausgewählten Distributor zugeordnet ist. In der folgenden Tabelle ist Live Labs der einzige Distributor, der Repräsentanten erstellen kann, da es Manager unter diesem Account gibt.

Adresstabelle

addressId firstName lastName companyName 
    82   Mary  Mertens IRON Co. 
    83   John  Smith Live Labs 
    84   Lauren  Cole  NULL 
    85   Sam  Little NULL 
    86   Wayne  Brady  NULL 
    87   Ronald  Foster NULL 
    88   Shawn  Wood  NULL 

Benutzer Tabelle

userId active username  role   addressId 
    19  1  mary  distributor   82 
    20  1  john  distributor   83 
    21  1  lauren manager    84 
    22  1  sam  manager    85 
    23  1  wayne manager    86 
    24  1  ronald representative  87 
    25  1  shawn representative  88 

DistributorManagerRelationship

distributorId managerId 
    20   21 
    20   22 
    20   23 

ManagerRepRelationship

repId managerId 
    24  21 
    24  22 
    25  22 

Hier ist das Problem, das ich habe. Wenn ein Distributor angemeldet ist und alle Benutzer unter ihm (seine Manager und Mitarbeiter) sieht, greift die SQL-Anweisung nur auf Repräsentanten und Manager zu, die eine Beziehung in der ManagerRepRelationship-Tabelle haben. Also zum Beispiel.

SELECT DISTINCT Users.userId, Users.role, Users.username, Address.firstName, Address.lastName 
FROM Users 
JOIN Address 
ON Users.addressId=Address.addressId 
JOIN ManagerRepRelationship 
ON Users.userId=ManagerRepRelationship.repId 
OR Users.userId=ManagerRepRelationship.managerId 
JOIN DistributorManagerRelationship 
ON Users.userId=DistributorManagerRelationship.managerId 
OR ManagerRepRelationship.managerId=DistributorManagerRelationship.managerId 
WHERE DistributorManagerRelationship.distributorId=20 AND Users.userId!=20 ORDER BY Address.lastName 

Die obige SQL-Anweisung werden alle Wiederholungen und Manager mit Live-Labs assoziiert Rückkehr AUSSER userId 23 (Wayne Brady). Ich verstehe, warum das so ist, weil Wayne nicht mit den Parametern des JOIN übereinstimmt, weil ihm ein Vertreter fehlt. Ich habe diese SQL-Anweisung seit Stunden gekämpft und ich kann es nicht richtig machen. Das Ergebnis, das ich möchte, sind alle Manager und Mitarbeiter, die in diesem Fall an Live Labs gebunden sind, auch wenn in der Tabelle ManagerRepRelationship keine Beziehung vorhanden ist. Vielleicht muss ich zwei verschiedene JOIN-Abfragen kombinieren? Ich stecke fest.

Ich hoffe, ich habe es gut gemacht, dies zu erklären, bitte kommentiere, wenn ich nichts klar genug gemacht habe.

+0

eine Datenbank-Engine Wählen Sie bitte , ist das MySQL ** oder ** SQL Server? – DavidG

+0

Taylor, das riecht nach links –

Antwort

1

Wenn Sie möchten, um Personen, die Vertreter nicht haben, dann wollen Sie null s für repräsentative Werte ermöglichen, so dass anstelle von

JOIN ManagerRepRelationship 

Sie

brauchen
LEFT JOIN ManagerRepRelationship 
Verwandte Themen