PDA

Vollständige Version anzeigen : verzwickte Abfrage


anja_taucht
20.01.2003, 14:21
Ich stehe gerade vor dem Problem einer verzwickten Abfrage.

Ich hab 2 Tabellen

1.Tabelle

User-ID AG1 AG2 AG3
User1 1 1 0
User2 0 1 1
User3 0 1 0
User4 1 0 1


AG bedeutet einfach Arbeitsgebiet, die 1 bedeutet der User hat die Berechtigung im Arbeitsgebiet xy Daten zu ändern.

2.Tabelle

AG Rolle1 Rolle2 Rolle3
AG1 A01 A02 A03
AG2 A01 A11 A12
AG3 A21 A22

A01, A02 sind einzelne Teilberechtigungen

Nun möchte ich eine Abfrage konstruieren
in der man folgende Informationen stehen hat.

User "Rolle1 von AG1" "Rolle2 von AG1" "Rolle3 von AG1" "Rolle1 von AG2" "Rolle2 von AG2" usw.


Ziel ist diese Abfrage mit einer 3.Tabelle zu vergleichen um festzustellen, ob jemand zu viele Berechtigungen hat oder zu wenig.

Kann da mir jemand weiterhelfen, da ich auf der langen Leitung gerade stehe.

Gruß Anja

jmc
20.01.2003, 14:48
Hi

Die Tabellen sind falsch normalisiert, du brauchst dafür 3 Tabellen:
1.Tabelle 'tblUser' enthält nur eine User_ID und Name, Vorname etc.etc.

2.Tabelle tblRolle, enthält nur eine Rolle_ID und Bezeichnung etc. etc.

3.Tabelle tblUser_Rolle enthält User_ID und Rolle_ID

das ganze sieht also als Beziehung so aus:

tblUser 1==:==n tblUser_Rolle n==:==1 tblRolle

Als Inhalt dann für die tblUser
1 Meier
2 Müller
3 Huber

tblRolle
1 AG01
2 AG02
3 AG03

tlbUser_Rolle
User_ID Rolle_ID
1 1
1 3
2 1
2 2
etc.

über eine Abfrage mit allen 3 Tabellen bekommst du nun locker deine Auswertung, wer hat welche Rolle - alles klar ? :cool:

anja_taucht
20.01.2003, 14:59
Hallo Jean,

werd es gleich mal ausprobieren. Ihr hört von mir, sobald es was neues gibt. Schon mal danke für den Tip

Gruß Anja

FW
20.01.2003, 15:00
... in wie weit ist denn hier Deine Tabelle1 von Relevanz?

anja_taucht
20.01.2003, 15:10
Tabelle 1 hat die wichtigste Rolle.
Sie gibt mir an welcher User in welchem Gesamtarbeitsgebiet was ändern darf. Dieses Gesamtarbeitsgebiet setzt sich wiederum aus mehreren Teilarbeitsgebieten zusammen, welche in Tabelle 2 aufgelistet sind.

Gruß Anja

jmc
20.01.2003, 15:15
Hi Anja

Meine Darstellung bezieht sich natürlich nur auf den Zusammenhang User/Rolle
Welche Rolle welches Gesamtarbeitsgebiet hat, das wäre dann in einer weiteren m:n Beziehung zwischen diesen beiden und die Teilarbeitsgebiete sind dann wiederum m:n zu Gesamtarbeitsgebiet.

Voraussetzung ist natürlich, dass das auch so hierarchisch ist, wie es aus deiner Darstellung hervorgeht.
Wenn das aber eine mehrfache Matrix ist, dann wird's komplexer ...

FW
20.01.2003, 15:17
... ich habe nur gefragt, weil die Inhalte dieser Tabelle in Deiner Abfrage gar nicht auftauchen, ansonsten ist der Antwort von jmc wohl nichts mehr hinzuzufügen...

anja_taucht
20.01.2003, 15:37
muß ich in einer ruhigen stunde mal ausprobieren, wenn ich es nicht hinbekomme melde ich mich einfach nochmal.

Danke Gruß Anja

anja_taucht
20.01.2003, 16:28
Hab meine Abfrage nun so hinbekommen wie ich das haben möchte, dank Eurer Hilfe.

Nun geht es aber noch weiter.

Bei meiner Abfrage kommt dieses Ergebniss heraus

User_ID Rolle Arbeitsgebiet
User1 Rolle01 AG0
User1 Rolle01 AG1
User1 Rolle02 AG0
User1 Rolle03 AG0
User1 Rolle11 AG1
User1 Rolle12 AG1
User2 Rolle01 AG1
User2 Rolle11 AG1
User2 Rolle12 AG1
User2 Rolle21 AG2
User2 Rolle22 AG2
User3 Rolle01 AG1
User3 Rolle11 AG1
User3 Rolle12 AG1
User4 Rolle01 AG0
User4 Rolle02 AG0
User4 Rolle03 AG0
User4 Rolle21 AG2
User4 Rolle22 AG2


Nun muß ich dies mit folgender Tabelle vergleichen und die nicht übereinstimmenden ausgeben. Sprich die Datensätze die in der Tabelle zuviel und zu wenig sind.

User_ID Rolle
User1 Rolle01
User1 Rolle02
User1 Rolle03
User1 Rolle01
User1 Rolle11
User1 Rolle12
User2 Rolle01
User2 Rolle11
User2 Rolle12
User2 Rolle21
User2 Rolle22
User3 Rolle01
User3 Rolle02
User3 Rolle03
User3 Rolle01
User3 Rolle11
User3 Rolle12
User4 Rolle12
User4 Rolle21
User4 Rolle22


Gibt es da eine Lösung?

Gruß Anja

FW
20.01.2003, 16:33
...
1.) SELECT * FROM Tabelle1 WHERE User_ID & Rolle NOT IN (SELECT User_ID & Rolle FROM Tabelle2)

2.) SELECT * FROM Tabelle2 WHERE User_ID & Rolle NOT IN (SELECT User_ID & Rolle FROM Tabelle1)
...

anja_taucht
20.01.2003, 16:39
Ich kann einfach nicht mehr denken. Wo muß ich die Anweisung

1.) SELECT * FROM Tabelle1 WHERE User_ID & Rolle NOT IN (SELECT User_ID & Rolle FROM Tabelle2)

2.) SELECT * FROM Tabelle2 WHERE User_ID & Rolle NOT IN (SELECT User_ID & Rolle FROM Tabelle1)


reinschreiben?

Vielen Dank Gruß Anja

FW
20.01.2003, 16:44
... z. B. in den Abfrageentwurf oder als RecordSource eines Formulares, etc....

anja_taucht
20.01.2003, 17:03
Danke werde es morgen früh gleich ausprobieren

Gruß Anja

anja_taucht
21.01.2003, 07:17
Ich danke Euch, es klappt wunderbar. :)

Gruß Anja