Abfragen über mehrere Tabellen JOINS

Es sollen in einer Datenbank Personen und Firmen verwaltet werden. Eine Person arbeitet in einer Firma. In Firmen arbeiten viele Personen:

 

 
Umsetzung:

Eine Person muss sich die Firma merken. Daher wird der Primärschlüssel einer Firma als Fremdschlüssel in die Tabelle Person übernommen.

create table person(
    personenid int primary key,
    name varchar(50),
    vorname varchar(50),
    geburtsdatum date,
    firmenid int
);


create table firma(
    firmenid int primary key,
    firmenname varchar(50)
);

Es sollen nun zwei Testdatensätze eingeben werden. Dabei arbeitet ein Herr Max Mustermann bei der PowerAG und eine Frau Hilde Musterfrau arbeitet bei der Firma IT-Solutions:

insert into person values (1234,'Mustermann', 'Max', '1980-12-05', 5555);

insert into firma values (5555, 'PowerAG');

insert into person values (1235,'Musterfrau', 'Hilde', '1972-04-14', 6666);

insert into firma values (6666, 'IT-Solutions');

Jetzt sollen in einer Abfrage alle Personen zusammen mit den Firmen aufgelistet werden, in welchen diese arbeiten.

Problem: Die Informationen liegen über zwei Tabellen (Person und Firma) verteilt:

Die Abfrage:

select person.vorname, person.name, firma.firmenname from person, firma;

greift zwar auf beide Tabellen zu, liefert aber das folgende Ergebnis:

 

In diesem Fall wird nämlich das Kreuzprodukt oder kartesische Produkt (d.h. alle Möglichen Kombinationen) zwischen den Tabellen gebildet.

Die Datensätze hängen jedoch nur zusammen, wenn der Wert des Fremschlüssels person.firmenid dem Wert des Primärschlüssels firma.firmenid entspricht.

Dies muss man in der Anfrage explizit angeben.

Die Anweisung:

select person.vorname, person.name, firma.firmenname from person, firma where person.firmenid=firma.firmenid;

 liefert das gewünschte Ergebis:

 

Diese Art JOIN nennt man Equi-Join (Gleichverbund).

Alternativ funktioniert die Anweisung:

SELECT person.vorname, person.name, firma.firmenname  FROM person INNER JOIN firma ON person.firmenid=firma.firmenid;

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell für den Betrieb der Seite, während andere uns helfen, diese Website und die Nutzererfahrung zu verbessern (Tracking Cookies). Sie können selbst entscheiden, ob Sie die Cookies zulassen möchten. Bitte beachten Sie, dass bei einer Ablehnung womöglich nicht mehr alle Funktionalitäten der Seite zur Verfügung stehen.