Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Abfrage über mehrere Tabellen (https://www.delphipraxis.net/92752-abfrage-ueber-mehrere-tabellen.html)

hirnstroem 25. Mai 2007 11:26

Datenbank: MS Access • Version: kA • Zugriff über: ADO

Abfrage über mehrere Tabellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
'loha Folks,

ich benötige etwas Hilfe. Im angehängten Bild sind die Beziehungen einiger Tabellen dargestellt.

Die Abfrage soll folgende Felder liefern:
Key.Code, Key.KeyID, Device_User.Access, Device_User.DeviceID

Der einzige Parameter für die Abfrage ist eine DeviceID.

In der Tabelle Device_User sowie Device_Key sind immer sämtliche Einträge aus der jeweils linken und rechten Tabelle vorhanden, in User_Key ist dies nicht der Fall.

Die Abfrage wird benötigt um Schlüssel auf Geräte zu Programmieren. Wenn ein Schlüssel mit einer Person in Beziehung steht, sollen dessen Zutrittsrechte übernommen werden, ansonsten wird der Zutritt verwehrt.

Leider sind meine bisherigen Versuche eine Abfrage zusammenzuschustern kläglich gescheitert. Ich hoffe deshalb auf etwas Beihilfe.

Meine bisherige, von Access verunstaltete Abfrage sieht so aus und liefert nur das Gewünschte Ergebnis wenn einem User ein Key zugeordnet ist. Vielleicht kann man darauf aufbauen:

[code=sql]
SELECT [Key].[Code], [Key].[KeyID], [Device_User].[Access], [Device_User].[DeviceID]
FROM ([User] INNER JOIN (([Key] INNER JOIN Device_Key ON [Key].[KeyID]=[Device_Key].[KeyID]) INNER JOIN User_Key ON [Key].[KeyID]=[User_Key].[KeyID] Or [User_Key].[KeyID] Is Null) ON [User].[UserID]=[User_Key].[UserID] Or [User_Key].[UserID] Is Null) INNER JOIN Device_User ON [User].[UserID]=[Device_User].[UserID]
WHERE [Device_User].[DeviceID]=[:DeviceID] And [Key].[KeyID]=[Device_Key].[KeyID] And ([User].[UserID]=[User_Key].[UserID] Or [User_Key].[UserID] Is Null)
GROUP BY [Key].
Code:
, [Key].[KeyID], [Access], [Device_User].[DeviceID];
Ich bin mir langsam auch nicht mehr sicher ob sich das gewünschte Resultat mit nur einer Abfrage realisieren lässt -.-

Grüsse
hirnstroem

DeddyH 25. Mai 2007 11:51

Re: Abfrage über mehrere Tabellen
 
Hallo,

ich habe es nicht getestet, aber versuch es mal so:
SQL-Code:
SELECT A.Code, A.KeyID, D.Access, D.DeviceID
FROM Key A
JOIN Device_Key B ON B.KeyID = A.KeyID
JOIN Device C ON C.DeviceID = B.DeviceID
JOIN Device_User D ON D.DeviceID = C.DeviceID
JOIN User E ON E.UserID = D.UserID
JOIN User_Key F ON F.UserID = E.UserID
AND F.KeyID = A.KeyID
WHERE D.DeviceID = :Param

hirnstroem 25. Mai 2007 12:14

Re: Abfrage über mehrere Tabellen
 
Argh, wenn ich das in ein von Access akzeptiertes Format bringen würde, bestünde die Möglichkeit, dass das funktioniert. Aber momentan sehe ich mich ausser Stande dies zu vollbringen. Aiaiai.

Aber vielen Dank schon einmal.

DeddyH 25. Mai 2007 12:15

Re: Abfrage über mehrere Tabellen
 
Da kann ich Dir leider auch nicht helfen, von Access hab ich keine Kelle. :roll:

hirnstroem 25. Mai 2007 12:18

Re: Abfrage über mehrere Tabellen
 
Kein Problem. Ich bin ja auch nicht davon ausgegangen, dass mir jemand die fixfertige lösung präsentiert. Access ist Krieg! :evil:

hirnstroem 25. Mai 2007 13:11

Re: Abfrage über mehrere Tabellen
 
Ich habe mich nun voller Verzweiflung an Access "Profis" gewendet (http://www.office-loesung.de/ftopic1...asc.php#616066) und werde bei hoffentlich noch eintretenden Fortschritten hier die Lösung aufführen.

DeddyH 25. Mai 2007 13:12

Re: Abfrage über mehrere Tabellen
 
Dann bin ich aber gespannt, wie das dann aussieht. ;)

hirnstroem 1. Jun 2007 10:43

Re: Abfrage über mehrere Tabellen
 
Die Access "Profis" wollen nicht helfen -.-

Vorläufig habe ich zwei verschiedene Abfragen im Einsatz, die eine ruft sämtliche Schlüssel ohne Benutzer ab, die andere jene mit Benutzer. Die Daten werden dann letztenendes in zwei getrennten Schleifen abgearbeitet.

Und wenn man das so macht, schafft man es auch Access-konforme Abfragen zu schreiben.

Schlüssel ohne Benutzer:

SQL-Code:
SELECT *
FROM Device_Key, [Key]
WHERE Device_Key.KeyID = [Key].KeyID AND Device_Key.DeviceID = :DeviceID
AND NOT EXISTS (SELECT *  FROM User_Key WHERE User_Key.KeyID = [Key].KeyID);
Schlüssel mit Benutzer:
SQL-Code:
SELECT
Key.KeyID, Key.Code, Device_User.Access, Device_Key.DeviceID, Device_User.DeviceID
FROM
([User] INNER JOIN Device_User ON User.UserID = Device_User.UserID) INNER JOIN (([Key] INNER JOIN Device_Key ON Key.KeyID = Device_Key.KeyID) INNER JOIN User_Key ON Key.KeyID = User_Key.KeyID) ON User.UserID = User_Key.UserID
WHERE
Device_Key.DeviceID=:1DeviceID
AND
Device_User.DeviceID=:2DeviceID;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz