2017-01-09 1 views
0

Ich habe 2 Beziehungen zwischen 2 Tabellen. Die erste Tabelle heißt Personnel, die zweite lautet Equipment.Mehrere Beziehung zwischen den Tabellen, wie die richtige für die Abfrage

Personnel hat 2 Verbindungen zu Equipment, eine ist die Person, die es gemietet hat und eine zweite Person, die die Ausrüstung hinzugefügt hat.

Jedes Mal, wenn ich versuche, eine Anfrage über die Person zu schreiben, die das Gerät hat und nach einem Namen und Nachnamen fragt, zeigt es mir immer die Person, die es mir hinzugefügt hat.

Wie kann ich es zwingen, nur eine "Verbindung" zu verwenden?

+1

Bitte fügen Sie das Schema Ihrer Tabellen zu Ihrer Frage hinzu. – reaanb

+0

... und einige Abfragen und Beispieltabellenwerte für Eingabe, Ausgabe und gewünschte Ausgabe. Lesen Sie über [fragen] und [mcve] s. PS Fremdschlüssel ("Beziehungen") haben nichts mit Abfragen zu tun. Sie teilen dem DBMS nur mit, dass Werte für einige Spalten auch Werte für andere Spalten sein müssen. Eine Tabelle (Basis- oder Abfrageergebnis) repräsentiert eine Anwendungsbeziehung/Assoziation. Geben Sie für jede Tabelle (Basis und Abfrage) das an, indem Sie angeben, was eine Zeile über die Anwendung sagt, indem Sie in der Tabelle sind. – philipxy

Antwort

0

Eine relationale Tabelle (Basis- oder Abfrageergebnis) repräsentiert eine Anwendungsbeziehung/Assoziation. Es enthält die Zeilen, deren Werte so miteinander verknüpft sind. Dh, dass aus einem charakterisierenden Prädikat (Anweisungsvorlage) eine echte Aussage (Aussage) wird.

Ihre Basis-Prädikate & Tabellen sind so etwas wie:

-- ID identifies a person named FNAME LNAME and ... 
Personnel(id, fname, lname, ...) 
-- equipment ID was added by person AID and rented by person RID and ... 
Equipment(id, aid, rid, ...) 

Wir ein Abfrageergebnis Prädikat aus Basis Prädikate, logische Operatoren und Bedingungen bauen. Damit der Abfrageausdruck Zeilen zurückgibt, die dieses Prädikat erfüllen, ersetzen wir Basisprädikate durch entsprechende Basisnamen und logische Operatoren durch entsprechende Beziehungsoperatoren.

Zeilen, bei denen eine Person mit Vornamen Namen hinzugefügt Ausrüstung 77:

/* rows where 
for some e.ID, ..., p.ID, ..., 
    p.FNAME = NAME 
and equipment e.ID was added by person e.AID and rented by person e.RID and ... 
and p.ID identifies a person named p.FNAME p.LNAME and ... 
and p.ID = e.AID 
and e.ID = 77 
*/ 
select p.fname as name 
from Equipment e join Personnel p on p.id = e.aid 
where e.id = 77 

Zeilen, bei denen Personen-ID mit Nachnamen Namen Mietgegenstände von Person AID mit Nachnamen ANAME hinzugefügt:

/* rows where 
for some e.ID, ..., r.ID, ..., a.ID, ..., 
    r.ID = ID and r.LNAME = NAME and a.ID = AID and a.LNAME = ANAME 
and equipment e.ID was added by person e.AID and rented by person e.RID and ... 
and r.ID identifies a person named r.FNAME r.LNAME and ... 
and r.ID = e.RID 
and a.ID identifies a person named a.FNAME a.LNAME and ... 
and a.ID = e.AID 
*/ 
select r.id, r.lname as name, a.id as aid, a.lname as aname 
from Equipment e 
join Personnel r on r.id = e.rid 
join Personnel a on a.id = e.aid 

Der Prädikat für eine Basistabelle unter Verwendung von Spalten, denen ein Alias ​​vorangestellt ist, wird der Tabellenname AS dieser Alias. Das UND von Basisprädikaten wird JOIN. Das UND einer Bedingung wird EIN oder WO. Die Gleichheit der Ergebnisspalten mit vorangestellten Spalten wird zu einem impliziten oder expliziten AS. Is there any rule of thumb to construct SQL query from a human-readable description?

FKs (Fremdschlüssel) werden häufig, aber fälschlicherweise als "Beziehungen" bezeichnet. Sie müssen nicht wissen, welche FKs abgefragt werden sollen. Sie teilen dem DBMS nur mit, dass Werte für bestimmte Spalten auch Werte für bestimmte andere Spalten sein müssen. (Für Integrität und Optimierung.) FK entspricht tatsächlich Instanzen einer Meta Beziehung/Zuordnung Tabellen. (Gleichwertig, auf Prädikate. Äquivalent, auf Beziehungen/Zuordnungen.) Wie durch bestimmte DBMS Metadatentabellen mit Prädikaten über Werte für bestimmte Spalten dargestellt, die auch Werte für bestimmte andere Spalten sein müssen.

Verwandte Themen