Lego - Die Datenbank

Ein Lego-Sammler benötigt zur Verwaltung eine Datenbank.

Beschreibung der Datenbank

Jeder BAUSTEIN-Typ besitzt eine eindeutige Nummer (NR) und eine Beschreibung (BESCHR). Baustein-Typen gibt es in verschiedenen Farben. Jede FARBE hat einen eindeutigen Namen (NAME) sowie einen korrespondierenden RGB-, CMYK- und PANTONE-Farbwert. Es wird für jeden Baustein-Typ vermerkt, in welchen Farben dieser bisher überhaupt produziert worden ist. Außerdem wird die Anzahl (ANZAHL) der Baustein-Typen pro Farbe gespeichert, die im Besitz des Sammlers sind (z.B. ist in der Sammlung der Baustein-Typ Nummer "1" dreimal in "grün", fünfmal in "rot" und einmal in "blau" enthalten). Baustein-Typen, die der Sammler besitzt, werden in KISTEN mit eindeutigen Nummern (NR), einer BESCHRIFTUNG und einem bestimmten Fassungsvermögen (FASSUNGSVER) aufbewahrt, wobei jeder Baustein-Typ genau einer Kiste zugeordnet ist, eine Kiste aber verschiedene Baustein-Typen beinhalten kann. Baustein-Typen werden gewöhnlich in Form von LEGOSETS vertrieben, die alle eine eindeutige Produktnummer (PNR), eine Bezeichnung (BEZ) und ein Erscheinungsjahr (JAHR) haben. Für jedes Set wird vermerkt, ob es im Besitz des Sammlers ist oder nicht (BESITZT). Besitzt der Sammler ein Set, so ist der Wert von besitzt 1. Es wird auch vermerkt, welche Baustein-Typen in welcher Farbe wie oft (ANZAHL) in einem Set enthalten sind. Neben Legosets, die im Handel einzeln erwerblich sind und von denen der Listenpreis (LPREIS) gespeichert werden soll, gibt es auch Legosets, die einzeln nicht gekauft werden können, sondern nur im Zusammenhang mit Produkten anderer Firmen erhältlich sind (z.B. als "gratis Beigaben" zu Frühstücksflocken). Speichern Sie bei dieser Art von "Werbesets" den Namen der Firma (FIRMA), die diese vertreibt. Weiters ist jedes Set genau einem bestimmten SPIELTHEMA zugeordnet, wobei ein Spielthema natürlich mehrere Sets umfassen kann. Spielthemen werden durch ihre Bezeichnung (BEZ) eindeutig identifiziert und sind hierarchisch organisiert, d.h. zu jedem Spielthema kann es mehrere untergeordnete Spielthemen geben, wobei ein bestimmtes Spielthema aber höchstens ein direkt übergeordnetes Spielthema hat. Jedes Set wird mit einer oder mehreren BAUANLEITUNGEN ausgeliefert. Bauanleitungen haben eine pro Set eindeutige Nummer (NR), eine Seitenanzahl (SEITEN), ein bestimmtes Papierformat (FORMAT) und werden - sofern der Sammler sie im Original besitzt - in speziellen MAPPEN aufgehoben. Mappen haben eine eindeutige Nummer (NR), eine BESCHRIFTUNG und können maximal zwanzig Bauanleitungen beinhalten. Für Bauanleitungen, die der Sammler in Form von PDF-Dateien besitzt, soll der Dateiname (DATEI) und der Speicherpfad (PFAD) eingetragen werden. Lego-Modelle, die der Sammler selbst entwirft, sollen ebenfalls in der Datenbank gespeichert werden. Gehen Sie davon aus, dass jedes MODELL einen Namen (NAME), ein Erstellungsdatum (DATUM), ein Beschreibung (TEXT) und einen Schwierigkeitsgrad (GRAD) besitzt, wobei die Kombination aus Namen und Datum eindeutig ist. Modelle können einem oder mehreren Spielthemen zugeordnet sein.


1)

Geben Sie die Produktnummer, die Bezeichnung und das Erscheinungsjahr aller Legosets aus.

		
			SELECT pnr, bez, jahr
			FROM Legoset;	
	
		


2)

Geben Sie die Produktnummer, die Bezeichnung, das Erscheinungsjahr und den Listenpreis aller Lego-Verkaufssets aus. Sortieren Sie die Liste absteigend nach dem Listenpreis.

		
			SELECT pnr, bez, jahr, lpreis
			FROM Verkaufsset NATURAL JOIN Legoset
			ORDER BY lpreis DESC;	
	
		


3)

Geben Sie die Namen derjenigen Firmen aus, deren Werbesets im Besitz des Sammlers sind. Vermeiden Sie dabei, dass eine Firma doppelt angefuehrt wird.

		
			SELECT DISTINCT firma
			FROM Werbeset NATURAL JOIN Legoset
			WHERE besitzt = 1;	
	
		


4)

Geben Sie Name, Datum und Text aller Modelle aus, die seit dem 1.1.2009 gebaut wurden und nicht schwieriger als Kategorie 4 sind. Verwenden Sie dazu die Funktion TO_DATE und folgendes Datumsformat: DD-MM-YYYY.

		
			SELECT name, datum, text
			FROM Modell
			WHERE datum >= TO_DATE('01-01-2009','dd-mm-yyyy') AND grad > 4;	
	
		

		
			select NAME, DATUM, TEXT
			from MODELL 
			where DATUM >= TO_DATE('01-01-2009', 'DD-MM-YYYY')
			and GRAD > 4	
	
		


5)

In der Mappe mit der Beschriftung 'Zum Nachbauen' werden die Bauanleitungen welcher Legosets (Produktnummer und Bezeichnung) aufgehoben? Vermeiden Sie doppelte Eintraege.

		
			SELECT DISTINCT l.pnr, l.bez 
			FROM Legoset l JOIN in_Mappe i ON (l.pnr = i.pnr) JOIN Mappe m ON (i.mappe = m.nr)
			WHERE beschriftung = 'Zum Nachbauen';	
	
		


6.1)

Geben Sie Produktnummer, Nummer und Format der Bauanleitungen aus zusammen mit der Nummer der Mappe, in der sie aufgehoben werden.

		
			SELECT pnr, nr, format, mappe 
			FROM Bauanleitung NATURAL JOIN in_Mappe;	
	
		


6.2)

Geben Sie Produktnummer, Nummer und Format ALLER Bauanleitungen aus zusammen mit der Nummer der Mappe, in der sie aufgehoben werden. Fuer Bauanleitungen, die nicht in Mappen aufgehoben werden, soll die Zahl '999' ausgegeben werden. (Stichwort: coalesce).

		
			SELECT b.pnr, b.nr, b.format, COALESCE(i.mappe, 999) AS Mappe
			FROM Bauanleitung b LEFT OUTER JOIN in_Mappe i ON (b.pnr = i.pnr AND b.nr = i.nr);	
	
		


6.3)

Geben Sie Produktnummer, Nummer und Format ALLER Bauanleitungen aus zusammen mit der Beschriftung der Mappe, in der sie aufgehoben werden. Fuer Bauanleitungen, die nicht in Mappen aufgehoben werden, soll 'keine Mappe vorhanden' ausgegeben werden. (Stichwort: coalesce).

		
			SELECT b.pnr, b.nr, b.format, COALESCE(m.beschriftung, 'keine Mappe vorhanden') AS Mappe 
			FROM Bauanleitung b LEFT OUTER JOIN (in_Mappe i JOIN Mappe m ON (i.mappe = m.nr)) ON (b.pnr = i.pnr AND b.nr = i.nr);	
	
		


7.1)

Geben Sie das Datum des zuletzt gebauten Modells aus.

		
			SELECT MAX(datum) AS Datum
			FROM Modell;	
	
		


7.2)

Geben Sie Name, Datum und Text der zuletzt gebauten Modelle aus.

		
			SELECT name, datum, text 
			FROM Modell
			WHERE datum = (SELECT MAX(datum) FROM Modell);	
	
		

		
			SELECT name, datum, text 
			FROM Modell
			WHERE datum >= ALL (SELECT datum FROM Modell);	
	
		

		
			SELECT m.name, m.datum, m.text 
			FROM Modell m
			WHERE NOT EXISTS (SELECT * FROM Modell WHERE datum > m.datum);	
	
		


7.3)

Geben Sie Name, Datum und Text des zuletzt gebauten Modells mit einem Schwierigkeitsgrad von 3 aus.

		
			SELECT name, datum, text 
			FROM Modell
			WHERE grad = 3 AND datum = (SELECT MAX(datum) FROM Modell WHERE grad = 3);	
	
		

		
			SELECT name, datum, text 
			FROM Modell WHERE grad = 3 AND datum >= ALL (SELECT datum FROM Modell WHERE grad = 3);	
	
		

		
			SELECT m.name, m.datum, m.text 
			FROM Modell m WHERE m.grad = 3 AND NOT EXISTS (SELECT * FROM Modell WHERE grad = 3 AND datum > m.datum);	
	
		


8)

Geben Sie ALLE Bausteine (Nummer, Beschreibung) aus und wenn die Kiste, in der sie aufgehoben werden, sehr gross ist (das Fassungsvermoegen liegt ueber 3 Liter), auch die Beschriftung der Kiste, ansonsten: 'keine grosse Kiste'.

		
			SELECT b.nr, b.beschr, coalesce(k.beschriftung, 'keine grosse Kiste') AS Kiste
			FROM Baustein b LEFT OUTER JOIN (in_Kiste i JOIN Kiste k ON (i.kiste = k.nr AND k.fassungsver > 3))  ON (b.nr = i.baustein);	
	
		


9.1)

Wieviele Spielthemen sind dem Modell 'Krokodil', das am 22.8.2009 erbaut wurde, zugeordnet?

		
			SELECT COUNT(*) AS Anzahl
			FROM zugeordnet
			WHERE name = 'Krokodil' AND datum = TO_DATE('22-08-2009','dd-mm-yyyy');	
	
		


9.2)

Geben Sie Name, Text und Schwierigkeitsgrad aller Modelle aus zusammen mit der Anzahl der zugeordneten Spielthemen.

		
			SELECT name, text, grad, COUNT(*) AS Anzahl
			FROM Modell NATURAL JOIN zugeordnet
			GROUP BY name, datum, text, grad;	
	
		


9.3)

Geben Sie Name, Text und Schwierigkeitsgrad jener Modelle aus, denen am meisten Spielthemen zugeordnet sind.

		
			SELECT name, text, grad
			FROM Modell NATURAL JOIN zugeordnet
			GROUP BY name, datum, text, grad
			HAVING COUNT(*) >= ALL (SELECT COUNT(*) FROM zugeordnet GROUP BY name, datum);	
	
		

		
			SELECT name, text, grad
			FROM Modell NATURAL JOIN zugeordnet
			GROUP BY name, datum, text, grad
			HAVING COUNT(*) = (SELECT MAX(ANZ) FROM (SELECT COUNT(*) AS ANZ FROM zugeordnet  GROUP BY name, datum))	
	
		


10)

Geben Sie zu jedem Legoset (Bezeichnung und Spielthema), das im Besitz des Sammlers ist, die Anzahl der in ihnen enthaltenen Einzelbausteine aus.

		
			SELECT l.bez, l.spielthema, SUM(i.anzahl) AS Anzahl
			FROM Legoset l JOIN in_Set i ON (l.pnr = i.legoset)
			WHERE l.besitzt = 1
			GROUP BY l.pnr, l.bez, l.spielthema;	
	
		


11.1)

Gesucht sind jene Lego-Verkaufssets (Produktnummer, Bezeichnung und Erscheinungsjahr), deren Listenpreis unter 20 Euro liegt und die nicht im Jahr 2003 erschienen sind.

		
			SELECT pnr, bez, jahr 
			FROM Legoset
			WHERE pnr IN (SELECT pnr FROM Verkaufsset WHERE lpreis < 20) AND jahr != 2003;	
	
		

		
			SELECT pnr, bez, jahr 
			FROM Legoset NATURAL JOIN Verkaufsset
			WHERE lpreis < 20 AND jahr != 2003;	
	
		


11.2)

Gesucht sind jene Lego-Verkaufssets (Produktnummer, Bezeichnung und Erscheinungsjahr), deren Listenpreis unter 20 Euro liegt und die keinen weissen Baustein enthalten.

		
			SELECT pnr, bez, jahr 
			FROM Legoset
			WHERE pnr IN (SELECT pnr FROM Verkaufsset WHERE lpreis < 20)
			        AND pnr NOT IN (SELECT legoset FROM in_Set WHERE farbe = 'Weiss');	
	
		

		
			SELECT pnr, bez, jahr 
			FROM Legoset NATURAL JOIN Verkaufsset
			WHERE lpreis < 20 AND pnr NOT IN (SELECT legoset FROM in_Set WHERE farbe = 'Weiss');	
	
		

		
			SELECT l.pnr, l.bez, l.jahr 
			FROM Legoset l
			WHERE EXISTS (SELECT * FROM Verkaufsset v WHERE v.lpreis < 20 AND v.pnr =l.pnr)
			        AND NOT EXISTS (SELECT * FROM in_Set i WHERE i.farbe = 'Weiss' AND i.legoset = l.pnr);	
	
		


12)

Gesucht sind jene Bausteintypen (Nummer und Beschreibung), die in allen gelisteten Farben produziert worden sind, aber nicht im Besitz des Sammlers sind.

		
			SELECT b.nr, b.beschr
			FROM Baustein b JOIN produziert_in i ON (b.nr = i.baustein)
			WHERE b.nr NOT IN (SELECT baustein FROM besitzt)
			GROUP BY b.nr, b.beschr
			HAVING COUNT(i.farbe) = (SELECT COUNT(*) FROM Farbe);	
	
		

		
			SELECT b.nr, b.beschr
			FROM Baustein b JOIN produziert_in i ON (b.nr = i.baustein)
			WHERE NOT EXISTS (SELECT * FROM besitzt WHERE baustein = b.nr)
			GROUP BY b.nr, b.beschr
			HAVING COUNT(i.farbe) = (SELECT COUNT(*) FROM Farbe);	
	
		

		
			SELECT * 
			FROM Baustein b
			WHERE NOT EXISTS (SELECT *
			    FROM FARBE
			    WHERE name NOT IN (SELECT farbe
			        FROM produziert_in
			        WHERE baustein = b.nr))
			    AND b.nr NOT IN (SELECT baustein FROM besitzt)	
	
		


13)

Geben Sie fuer jedes Erscheinungsjahr das Legoset (Bezeichnung) mit der hoechsten Anzahl an Einzelbausteinen aus.

		
			SELECT l.jahr, l.bez 
			FROM Legoset l JOIN in_Set i ON (l.pnr = i.legoset)
			GROUP BY l.jahr, l.pnr, l.bez
			HAVING SUM(i.anzahl) >= ALL (SELECT SUM(n.anzahl) FROM in_Set n JOIN Legoset e ON (n.legoset = e.pnr) WHERE
			e.jahr = l.jahr GROUP BY e.pnr);	
	
		

		
			SELECT l.jahr, l.bez 
			FROM Legoset l JOIN in_Set i ON (l.pnr = i.legoset)
			GROUP BY l.jahr, l.pnr, l.bez
			HAVING SUM(i.anzahl) = (SELECT MAX(anz) FROM (SELECT e.jahr, SUM(n.anzahl) AS anz FROM in_Set n JOIN Legoset e ON (n.legoset = e.pnr) GROUP BY e.pnr, e.jahr) WHERE jahr = l.jahr);	
	
		


14)

Geben Sie eine Liste ALLER Farben aus (Name und Pantone-Farbwert) und vermerken Sie in einer zusaetzlichen Spalte: a) 'keine Kiste', falls die Farbe in keiner Kiste vorkommt, b) 'eine Kiste', falls die Farbe in genau einer Kiste vorkommt und c) 'mehrere Kisten', falls die Farbe in mehr als einer Kiste vorkommt.

		
			SELECT f.name, f.pantone, 'keine Kiste' AS Kisten
			FROM Farbe f WHERE NOT EXISTS (SELECT * FROM in_Kiste i JOIN Baustein b ON (i.baustein = b.nr)
			        JOIN besitzt t ON (b.nr = t.baustein) WHERE t.farbe = f.name)
			UNION
			SELECT f.name, f.pantone, 'eine Kiste' AS Kisten
			FROM Farbe f WHERE EXISTS (SELECT * FROM in_Kiste i JOIN Baustein b ON (i.baustein = b.nr)
			        JOIN besitzt t ON (b.nr = t.baustein) WHERE t.farbe = f.name GROUP BY t.farbe HAVING COUNT(distinct i.kiste) = 1)
			UNION
			SELECT f.name, f.pantone, 'mehrere Kisten' AS Kisten
			FROM Farbe f WHERE EXISTS (SELECT * FROM in_Kiste i JOIN Baustein b ON (i.baustein = b.nr)
			        JOIN besitzt t ON (b.nr = t.baustein) WHERE t.farbe = f.name GROUP BY t.farbe HAVING COUNT(distinct i.kiste) > 1);	
	
		

		
			SELECT f.name, f.pantone, 'keine Kiste' AS Kisten
			FROM Farbe f WHERE f.name NOT IN (SELECT t.farbe FROM in_Kiste i JOIN Baustein b ON (i.baustein = b.nr)
			        JOIN besitzt t ON (b.nr = t.baustein))
			UNION
			SELECT f.name, f.pantone, 'eine Kiste' AS Kisten
			FROM Farbe f WHERE f.name IN (SELECT t.farbe FROM in_Kiste i JOIN Baustein b ON (i.baustein = b.nr)
			        JOIN besitzt t ON (b.nr = t.baustein) GROUP BY t.farbe HAVING COUNT(distinct i.kiste) = 1)
			UNION
			SELECT f.name, f.pantone, 'mehrere Kisten' AS Kisten
			FROM Farbe f WHERE f.name IN (SELECT t.farbe FROM in_Kiste i JOIN Baustein b ON (i.baustein = b.nr)
			        JOIN besitzt t ON (b.nr = t.baustein) GROUP BY t.farbe HAVING COUNT(distinct i.kiste) > 1);	
	
		

		
			SELECT f.name, f.pantone, 'keine Kiste' AS Kisten
			FROM Farbe f WHERE NOT EXISTS (SELECT * FROM in_Kiste i
			        JOIN besitzt t ON (i.baustein = t.baustein) WHERE t.farbe = f.name)
			UNION
			SELECT f.name, f.pantone, 'eine Kiste' AS Kisten
			FROM Farbe f WHERE EXISTS (SELECT * FROM in_Kiste i
			        JOIN besitzt t ON (i.baustein = t.baustein) WHERE t.farbe = f.name GROUP BY t.farbe HAVING COUNT(distinct i.kiste) = 1)
			UNION
			SELECT f.name, f.pantone, 'mehrere Kisten' AS Kisten
			FROM Farbe f WHERE EXISTS (SELECT * FROM in_Kiste i
			        JOIN besitzt t ON (i.baustein = t.baustein) WHERE t.farbe = f.name GROUP BY t.farbe HAVING COUNT(distinct i.kiste) > 1);	
	
		

		
			SELECT f.name, f.pantone, 'keine Kiste' AS Kisten
			FROM Farbe f WHERE f.name NOT IN (SELECT farbe FROM in_Kiste NATURAL
			        JOIN besitzt)
			UNION
			SELECT f.name, f.pantone, 'eine Kiste' AS Kisten
			FROM Farbe f WHERE f.name IN (SELECT farbe FROM in_Kiste NATURAL
			        JOIN besitzt GROUP BY farbe HAVING COUNT(distinct kiste) = 1)
			UNION
			SELECT f.name, f.pantone, 'mehrere Kisten' AS Kisten
			FROM Farbe f WHERE f.name IN (SELECT farbe FROM in_Kiste NATURAL JOIN
			        besitzt GROUP BY farbe HAVING COUNT(distinct kiste) > 1);	
	
		

		
			SELECT name, pantone, 'keine Kiste'
			FROM Farbe f
			WHERE 0 =
			        (
			                SELECT COUNT (DISTINCT i.kiste)
			                FROM In_Kiste i NATURAL JOIN  Besitzt b
			                WHERE b.farbe = f.name
			        )
			UNION
			SELECT name, pantone, 'eine Kiste'
			FROM Farbe f
			WHERE 1 =
			        (
			                SELECT COUNT (DISTINCT i.kiste)
			                FROM In_Kiste i NATURAL JOIN  Besitzt b
			                WHERE b.farbe = f.name
			        )
			UNION
			SELECT name, pantone, 'mehrere Kisten'
			FROM Farbe f
			WHERE 1 <
			        (
			                SELECT COUNT (DISTINCT i.kiste)
			                FROM In_Kiste i NATURAL JOIN  Besitzt b
			                WHERE b.farbe = f.name
			        );	
	
		


15)

Geben Sie ALLE Mappen (Beschriftung) aus und dazu die Anzahl der Legosets zum Spielthema 'Baufahrzeuge', deren Bauanleitungen sich in dieser Mappe befinden.

		
			SELECT m.beschriftung, COUNT(DISTINCT l.pnr) AS anz_legosets
			FROM Mappe m LEFT OUTER JOIN (in_Mappe i JOIN Legoset l ON (i.pnr = l.pnr AND l.spielthema = 'Baufahrzeuge')) ON (m.nr = i.mappe)
			GROUP BY m.nr, m.beschriftung;	
	
		


16)

Um wieviel kosten die Verkaufssets, die dem Spielthema 'Zuege' zugeordnet sind, durchschnittlich mehr als die anderer Spielthemen?

		
			SELECT a.preis - b.preis AS preis_differenz
			FROM (SELECT AVG(lpreis) AS preis FROM Legoset NATURAL JOIN Verkaufsset WHERE spielthema = 'Zuege') a,
			(SELECT AVG(lpreis) AS preis FROM Legoset NATURAL JOIN Verkaufsset WHERE spielthema != 'Zuege') b;	
	
		


17)

Geben Sie eine Liste ALLER Spielthemen aus zusammen mit der Anzahl der zugeordneten Werbesets, der Anzahl der zugeordneten Verkaufssets und der Anzahl der zugeordneten Modelle.

		
			SELECT s.bez, coalesce(w.anz, 0) AS Werbesets, coalesce(v.anz, 0) AS Verkaufssets, coalesce(m.anz, 0) AS Modelle
			FROM Spielthema s LEFT OUTER JOIN (SELECT spielthema, COUNT(pnr) AS anz FROM Legoset NATURAL JOIN Werbeset
			        GROUP BY spielthema) w ON (s.bez = w.spielthema) LEFT OUTER JOIN (SELECT spielthema, COUNT(pnr) AS anz
			        FROM Legoset NATURAL JOIN Verkaufsset GROUP BY spielthema) v ON (s.bez = v.spielthema) LEFT OUTER JOIN
			        (SELECT spielthema, COUNT(*) AS anz FROM zugeordnet GROUP BY spielthema) m ON (m.spielthema = s.bez);	
	
		

		
			SELECT s.bez, COUNT(DISTINCT w.pnr) AS Werbesets, COUNT(DISTINCT v.pnr) AS Verkaufssets, COUNT(DISTINCT CONCAT(z.name, z.datum)) AS Modelle
			FROM Spielthema s LEFT OUTER JOIN (SELECT pnr, spielthema FROM Legoset NATURAL JOIN Werbeset) w ON (s.bez = w.spielthema)
			        LEFT OUTER JOIN (SELECT pnr, spielthema FROM Legoset NATURAL JOIN Verkaufsset) v ON (s.bez = v.spielthema) LEFT OUTER JOIN
			        zugeordnet z ON (z.spielthema = s.bez)
			GROUP BY s.bez;	
	
		

		
			SELECT s.bez, werbe.anz AS werbesets, verkauf.anz AS verkaufsets, modell.anz AS modelle
			FROM Spielthema s JOIN
			        (
			                SELECT spielthema, COUNT (*) AS anz
			                FROM zugeordnet
			                GROUP BY spielthema
			                UNION
			                SELECT bez, 0 AS anz
			                FROM Spielthema
			                WHERE bez NOT IN
			                        (
			                                SELECT DISTINCT spielthema
			                                FROM zugeordnet
			                        )
			        ) modell ON ( s.bez = modell.spielthema ) JOIN
			        (
			                SELECT spielthema, COUNT (*) AS anz
			                FROM Werbeset NATURAL JOIN Legoset
			                GROUP BY spielthema
			                UNION
			                SELECT bez, 0 AS anz
			                FROM Spielthema
			                WHERE bez NOT IN
			                        (
			                                SELECT DISTINCT spielthema
			                                FROM Werbeset NATURAL JOIN Legoset
			                        )
			        ) werbe ON ( s.bez = werbe.spielthema ) JOIN
			        (
			                SELECT spielthema, COUNT (*) AS anz
			                FROM Verkaufsset NATURAL JOIN Legoset
			                GROUP BY spielthema
			                UNION
			                SELECT bez, 0 AS anz
			                FROM Spielthema
			                WHERE bez NOT IN
			                        (
			                                SELECT DISTINCT spielthema
			                                FROM Verkaufsset NATURAL JOIN Legoset
			                        )
			        ) verkauf ON ( s.bez = verkauf.spielthema )
			;	
	
		


18)

Geben Sie jene Legosets (Produktnummer, Bezeichnung und Erscheinungsjahr) aus, die einem Spielthema zugeordnet sind, dem auch mindestens 20 Prozent der Modelle mit einem Schwierigkeitsgrad von unter 4 zugeordnet sind.

		
			SELECT pnr, bez, jahr
			FROM Legoset
			WHERE spielthema IN (SELECT spielthema FROM zugeordnet NATURAL JOIN Modell WHERE grad < 4 GROUP BY spielthema HAVING COUNT(*) >=
			(SELECT COUNT(*) * 0.2 FROM zugeordnet NATURAL JOIN Modell WHERE grad < 4));	
	
		

		
			SELECT l.pnr, l.bez, l.jahr
			FROM Legoset l
			WHERE EXISTS (SELECT * FROM zugeordnet NATURAL JOIN Modell WHERE grad < 4 AND spielthema = l.spielthema GROUP BY spielthema HAVING COUNT(*) >=
			(SELECT COUNT(*) * 0.2 FROM zugeordnet NATURAL JOIN Modell WHERE grad < 4));	
	
		

		
			SELECT pnr, bez, jahr
			FROM Legoset
			WHERE spielthema IN (SELECT spielthema FROM zugeordnet NATURAL JOIN Modell WHERE grad < 4 GROUP BY spielthema HAVING COUNT(*) >=
			(SELECT COUNT(*) / 5 FROM zugeordnet NATURAL JOIN Modell WHERE grad < 4));	
	
		

		
			SELECT l.pnr, l.bez, l.jahr
			FROM Legoset l
			WHERE EXISTS (SELECT * FROM zugeordnet NATURAL JOIN Modell WHERE grad < 4 AND spielthema = l.spielthema GROUP BY spielthema HAVING COUNT(*) >=
			(SELECT COUNT(*) / 5 FROM zugeordnet NATURAL JOIN Modell WHERE grad < 4));	
	
		


19)

Welche Verkaufssets (Produktnummer und Bezeichnung) haben ein neueres Erscheinungsjahr als das zuletzt erschienene Werbeset?

		
			SELECT pnr, bez
			FROM Verkaufsset NATURAL JOIN Legoset
			WHERE jahr > (SELECT MAX(jahr) FROM Legoset NATURAL JOIN Werbeset);	
	
		


20)

Gesucht sind jene Legosets (Produktnummer, Bezeichnung und Erscheinungsjahr), die Bausteine mit dem Pantone-Farbwert '2728 C' und/oder '165 C' enthalten, aber keine mit dem Pantone-Farbwert 'CoolGrey 1 C'.

		
			SELECT DISTINCT l.pnr, l.bez, l.jahr
			FROM Legoset l JOIN in_Set i ON (l.pnr = i.legoset) JOIN Farbe f ON (i.farbe = f.name)
			WHERE f.pantone = '2728 C' OR f.pantone = '165 C' AND l.pnr NOT IN
			        (SELECT legoset FROM in_Set JOIN Farbe ON (in_Set.farbe = Farbe.name AND pantone = 'CoolGrey 1 C'));	
	
		


21)

Geben Sie alle Legosets (Produktnummer, Bezeichnung und Erscheinungsjahr) aus, von denen mindestens eine Bauanleitung in einer Mappe eingeordnet ist und die ausserdem einen Bausteintyp enthalten, der in mindestens 3 verschiedenen Farben in diesem Set vorkommt.

		
			SELECT DISTINCT l.pnr, l.bez, l.jahr
			FROM Legoset l JOIN in_Set i ON (l.pnr = i.legoset)
			WHERE l.pnr IN (SELECT pnr FROM in_Mappe)
			GROUP BY l.pnr, l.bez, l.jahr, i.baustein
			HAVING COUNT(i.farbe) >= 3;	
	
		

		
			SELECT DISTINCT l.pnr, l.bez, l.jahr
			FROM Legoset l JOIN in_Set i ON (l.pnr = i.legoset)
			WHERE EXISTS (SELECT * FROM in_Mappe WHERE pnr = l.pnr)
			GROUP BY l.pnr, l.bez, l.jahr, i.baustein
			HAVING COUNT(i.farbe) >= 3;	
	
		

		
			SELECT DISTINCT l.pnr, l.bez, l.jahr
			FROM Legoset l JOIN in_Set i ON (l.pnr = i.legoset) JOIN in_Mappe m ON (l.pnr = m.pnr)
			GROUP BY l.pnr, l.bez, l.jahr, i.baustein
			HAVING COUNT(DISTINCT i.farbe) >= 3;	
	
		


22)

In welcher kleinen Kiste (Fassungsvermoegen betraegt weniger als 3 Liter) ist die Anzahl der Einzelbausteine, die in ihnen gelagert werden, am hoechsten? Geben Sie die Beschriftung der Kiste zusammen mit der Anzahl der in ihnen enthaltenen Einzelbausteine aus.

		
			SELECT k.beschriftung, SUM(b.anzahl) AS Anzahl
			FROM Kiste k JOIN in_Kiste i ON (k.nr = i.kiste) JOIN besitzt b ON (i.baustein = b. baustein)
			WHERE k.fassungsver < 3
			GROUP BY k.nr, k.beschriftung
			HAVING SUM(b.anzahl) >= ALL(SELECT SUM(b.anzahl)
			        FROM Kiste k JOIN in_Kiste i ON (k.nr = i.kiste) JOIN besitzt b ON (i.baustein = b. baustein)
			        WHERE k.fassungsver < 3
			        GROUP BY k.nr);	
	
		

		
			SELECT k.beschriftung, SUM(b.anzahl) AS Anzahl
			                FROM Kiste k JOIN in_Kiste i ON (k.nr = i.kiste) JOIN besitzt b ON (i.baustein = b. baustein)
			                WHERE k.fassungsver < 3
			                GROUP BY k.nr, k.beschriftung
			                HAVING SUM(b.anzahl) = ( SELECT MAX(anz)
			                        FROM        (SELECT SUM(b.anzahl) AS anz
			                                FROM Kiste k JOIN in_Kiste i ON (k.nr = i.kiste) JOIN besitzt b ON (i.baustein = b. baustein)
			                                WHERE k.fassungsver < 3
			                                GROUP BY k.nr));	
	
		


23)

Geben Sie eine Liste ALLER Spielthemen aus und dazu den Namen, das Datum und den Schwierigkeitsgrad desjenigen Modells, das diesem Spielthema zuletzt zugeordnet wurde.

		
			SELECT s.bez, m.name, m.datum, m.grad
			FROM (zugeordnet z JOIN Modell m ON (z.name = m.name AND z.datum = m.datum) JOIN
			        (SELECT spielthema, MAX(datum) as dat FROM zugeordnet GROUP BY spielthema) t ON (t.spielthema = z.spielthema AND t.dat = z.datum))
			        RIGHT OUTER JOIN Spielthema s ON (z.spielthema = s.bez);	
	
		


24)

Geben Sie eine Liste ALLER Verkaufssets (Produktnummer, Bezeichnung und Erscheinungsjahr) aus und dazu, wie viele andere Verkaufssets es gibt, deren Listenpreis hoeher ist.

		
			SELECT l.pnr, l.bez, l.jahr, (SELECT COUNT(*) FROM Verkaufsset WHERE lpreis > v.lpreis) AS Anzahl
			FROM Verkaufsset v  JOIN Legoset l ON (v.pnr = l.pnr);