Einzelnen Beitrag anzeigen

hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#1

Einer SQL Abfrage eine zusätzliche Bedingung hinzufügen

  Alt 15. Jan 2008, 15:36
Datenbank: MS Access • Version: kA • Zugriff über: ADO
'loha Folks,

der folgenden Abfrage soll eine Zusätzliche Bedingung hinzugefügt werden:

SQL-Code:
SELECT *
FROM
(Room INNER JOIN
  (Floor INNER JOIN
    (DeviceType INNER JOIN
      (Building INNER JOIN
        (Application INNER JOIN Device ON [Application].[ApplicationID] =[Device].[ApplicationID])
      ON [Building].[BuildingID] =[Device].[BuildingID])
    ON [DeviceType].[DeviceTypeID] =[Device].[DeviceTypeID])
  ON [Floor].[FloorID] =[Device].[FloorID])
ON [Room].[RoomID] =[Device].[RoomID])
WHERE
DeviceType.DeviceType = 'DeviceType';
Die Abfrage liefert sämtliche Geräte aus der Tabelle 'Device' mit dem Gerätetyp 'DeviceType' (sowie sämtliche miteinbezogene Felder).

Nun ist es so, dass es zusätzlich zu den Geräten auch Benutzer gibt. Diese Benutzer haben entweder zugriff auf ein Gerät oder keinen Zugriff. Die Abfrage soll nun so angepasst werden, dass sie nur noch Ergebnisse (Geräte) liefert, für welche der Benutzer der die Abfrage ausführt (dessen UserID etc. ist bekannt) auch zugriff hat. Zudem soll die Möglichkeit bestehen, dass wie bei der obigen Abfrage sämtliche Geräte abgefragt werden können.

Mein Versuch dies zu realisieren sieht folgendermassen aus:

SQL-Code:
SELECT *
FROM
(Room INNER JOIN
  (Floor INNER JOIN
    (DeviceType INNER JOIN
      (Building INNER JOIN
        (Application INNER JOIN Device ON Application.ApplicationID = Device.ApplicationID)
      ON Building.BuildingID = Device.BuildingID)
    ON DeviceType.DeviceTypeID = Device.DeviceTypeID)
  ON Floor.FloorID = Device.FloorID)
ON Room.RoomID = Device.RoomID) INNER JOIN Device_User
ON Device.DeviceID = Device_User.DeviceID
WHERE
DeviceType.DeviceType = 'DeviceType'
AND
((Device_User.UserID = :UserIDIncorporateAccessRights AND Device_User.Access = True) OR :UserIDDoNotIncorporateAccessRights = 0);
Der eine Teil der Bedingung nämlich, dass die Abfrage nur noch Ergebnisse liefert, für welche der Aufrufende Benutzer Rechte hat, wäre hiermit erfüllt indem der Parameter :UserIDIncorporateAccessRights mit der UserID des entsprechenden Benutzers gefüttert wird.

Der andere Teil, dass auch sämtliche Geräte ohne Berücksichtigung der Benutzerrechte, abgefragt werden noch nicht. Übergebe ich dem Parameter :UserIDIncorporateAccessRights einen Wert der nicht zutreffen kann und dem Parameter :UserIDDoNotIncorporateAccessRights den Wert 0 damit die Bedingung zutrifft, so wird das kartesische Produkt gebildet. So ist im Ergebniss also jedes Gerät soviele Male vorhanden, wie es Benutzer in der Datenbank gibt.

Kann ich nun das Ergebnis irgendwie derart filtern, dass ein Gerät nur einmal im Ergebnis vorkommt?

Für etwas Beihilfe bin ich sehr empfänglich und dankbar -.-

Grüsse
hirnstroem

PS: Ich hoffe man versteht, was isch schrieb.
inde deus abest
  Mit Zitat antworten Zitat