\documentclass{bschlangaul-aufgabe}
\bLadePakete{sql}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Aufgabe 2},
  Thematik = {Restaurant},
  Referenz = 66116-2020-H.T2-TA2-A2,
  RelativerPfad = Examen/66116/2020/09/Thema-2/Teilaufgabe-2/Aufgabe-2.tex,
  ZitatSchluessel = examen:66116:2020:09,
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {SQL},
  EinzelpruefungsNr = 66116,
  Jahr = 2020,
  Monat = 09,
  ThemaNr = 2,
  TeilaufgabeNr = 2,
  AufgabeNr = 2,
}

Gegeben ist der folgende Ausschnitt eines Schemas für die Verwaltung
eines Restaurants.
\index{SQL}
\footcite{examen:66116:2020:09}

Hinweis: Unterstrichene Attribute sind Primärschlüsselattribute, kursiv
geschriebene Attribute

sind Fremdschlässelattribute.

Restaurant : {|
RestaurantID : INTEGER,
RestaurantName : VARCHAR (255),
StadtName : VARCHAR(255),

PLZ: INTEGER, 1}

Küche: {|

RestaurontID : INTEGER,
Art : VARCHAR(255),
KochPersonID : INTEGER

Straße : VARCHAR (255),
Hausnummer: INTEGER,
Kategorie : VARCHAR (255)

1}

Stadt : {[ Person : {|

StadtName : VARCHAR(255), PersonID : INTEGER,

Land : VARCHAR(255) Name : VARCHAR(255),
1} Vorname : VARCHAR (255),
StadtName : VARCHAR(255),
PLZ: INTEGER,
Straße : VARCHAR(255),

Hausnummer: INTEGER

bevorzugt : {|
PersonID : INTEGER,
Art : VARCHAR(255)

} I}

Die Tabelle Restaurant beschreibt Restaurants eindeutig durch ihre ID.
Zudem wird der Name, die Adresse des Restaurants und die
(Sterne-)Kategorie gespeichert. Küche enthält u. a. Informationen zu der
Art der Küche. Dabei kann ein Restaurant mehrere Arten anbieten, z. B.
italienisch, deutsch, etc. In der Tabelle Stadt werden der Name der
Stadt sowie das Land verwaltet, in dem die Stadt liegt. Wir gehen davon
aus, dass eine Stadt eindeutig durch ihren Namen gekennzeichnet ist.
Person beschreibt Personen mit Name, Vorname und Adresse. Personen
werden eindeutig durch eine ID identifiziert. Die Tabelle bevorzugt gibt
an, welche Person welche Art der Küche präferiert.

Bearbeiten Sie die folgenden Teilaufgaben:

\begin{enumerate}

%%
% a)
%%

\item Erläutern Sie kurz, warum das Attribut Art in Küche Teil des
Primärschlüssels ist.

\begin{bAntwort}
Es kann mehr als eine Küche pro Restaurant geben.
\end{bAntwort}

%%
% b)
%%

\item Schreiben Sie eine SQL-Anweisung, welche alle Städte findet, in
denen man “deutsch” (Art der Küche) essen kann.

\begin{bAntwort}
\begin{minted}{sql}
SELECT DISTINCT s.StadtName
FROM Stadt s, Restaurant r, Küche k
WHERE s.Stadtname = r.StadtName AND r.RestaurantID = k.RestaurantID AND Art = 'deutsch';
\end{minted}
\end{bAntwort}

%%
% c)
%%

\item Schreiben Sie eine SQL-Abfrage, die alle Personen (Name und
Vorname) liefert, die kein deutsches Essen bevorzugen. Verwenden Sie
keinen Join.

\begin{bAntwort}
\begin{minted}{sql}
SELECT Name, Vorname
FROM Person
WHERE PersonID IN (SELECT DISTINCT PersonID
FROM bevorzugt
EXCEPT
SELECT DISTINCT PersonID
FROM bevorzugt
WHERE Art = 'deutsch');
\end{minted}
\end{bAntwort}

%%
% d)
%%

\item Schreiben Sie eine SQL-Abfrage, die für jede Stadt (StadtName) und
Person (PersonID) die Anzahl der Restaurants ermittelt, in denen diese
Person bevorzugt essen gehen würde. Es sollen nur Städte ausgegeben
werden, in denen es mindestens drei solche Restaurants gibt.

\begin{bAntwort}
\begin{minted}{sql}
SELECT r.StadtName, b.PersonID, count(DISTINCT r.RestaurantID) as Anzahl
FROM Restaurant r, bevorzugt b, Kueche k
WHERE r.RestaurantID = k.RestaurantID AND k.Art = b.Art
GROUP BY r.StadtName, b.PersonID
HAVING count(r.RestaurantID) >= 3;
\end{minted}
\end{bAntwort}

%%
% e)
%%

\item Schreiben Sie eine SQL-Abfrage, die die Namen aller Restaurants
liefert, in denen sich die Personen mit den IDs 1 und 2 gemeinsam zum
Essen verabreden können, und beide etwas zum Essen finden, das sie
bevorzugen. Es sollen keine Duplikate ausgegeben werden.

\begin{bAntwort}
\begin{minted}{sql}
CREATE VIEW Person1 AS
SELECT DISTINCT r.RestaurantID, r.RestaurantName
FROM Person p, bevorzugt b, Restaurant r, Küche k
WHERE r.StadtName = p.StadtName AND p.PersonID = b.PersonID
AND r.RestaurantID = k.RestaurantID AND k.Art = b.Art
AND p.PersonID = 1;
CREATE VIEW Person2 AS
SELECT DISTINCT r.RestaurantID, r.RestaurantName
FROM Person p, bevorzugt b, Restaurant r, Küche k
WHERE r.StadtName = p.StadtName AND p.PersonID = b.PersonID
AND r.RestaurantID = k.RestaurantID AND k.Art = b.Art
AND p.PersonID = 2;
SELECT * FROM Person1
INTERSECT
SELECT * FROM Person2;
\end{minted}
\end{bAntwort}

\end{enumerate}
\end{document}
