SQL - Structured Query Language AIFB SS (1/7) Verknüpfung von Relationen mit Subqueries (1/7) 32. Namen aller Angestellten, die mit 100 % ihrer Arbeitszeit an einem Projekt mitarbeiten. 1. Schritt: Bestimme aus ang-pro alle ANG-NR, die zu PROZ-ARBZEIT=100 gehören (Query a) (das sind geschachtelte Queries) anstelle von Join Ergebnis: ang-pro (#=m) P-NRANG-NRPROZ-ARBZEIT ANG-NR SELECT FROM WHERE ANG-NR ang-pro PROZ-ARBZEIT=100;
SQL - Structured Query Language AIFB SS angestellte (#=n) ANG-NRNAMEWOHNORTABT-NR 3115 MeyerKarlsruhe MüllerMannheim KleinMannheim MausKarlsruhe GroßKarlsruhe SchmittHeidelberg MayerleinBruchsal MüllerKarlsruhe SchulzBruchsal KrämerLudwigshafen MeierPforzheim SchusterWorms31 (2/7) Verknüpfung von Relationen mit Subqueries (2/7) 2. Schritt: Wähle in angestellte alle Tupel aus, deren ANG-NR in der oben gegebenen Ergebnismenge liegt: (Query b) Ergebnis: NAME Müller Groß Schmitt Müller SELECT FROM WHERE NAME angestellte ANG-NR IN (3207, 2412, 2314,1324);
SQL - Structured Query Language AIFB SS (3/7) Verknüpfung von Relationen mit Subqueries (3/7) {äußere Query b} SELECT NAME FROM angestellte WHERE ANG-NR IN {Subquery a} (SELECT ANG-NR FROM ang-pro WHERE PROZ-ARBZEIT = 100) Vorgehensweise des Systems: a) Abarbeitung Subquery (a) b) Übergabe Ergebnis an übergeordnete (äußere) Query (b) c) Abarbeitung Query b mit dem übergebenen Ergebnis Zusammenfassung zu geschachtelter Query:
SQL - Structured Query Language AIFB SS (4/7) Verknüpfung von Relationen mit Subqueries (4/7) SELECT NAME FROM angestellte, ang-pro WHERE PROZ-ARBZEIT = 100 AND ang-pro.ANG-NR = angestellte.ANG-NR; 33. Äquivalente Abfrage mit Join: Vergleich 32. mit 33.: (vereinfachte Betrachtung!) man betrachte Anzahl der notwendigen DB-Zugriffe! bei 32.:n+m bei 33.:n m Ergebnis von 32. SELECT NAME FROM angestellte WHERE ANG-NR IN (SELECT ANG-NR FROM ang-pro WHERE PROZ-ARBZEIT = 100)
SQL - Structured Query Language AIFB SS (5/7) Verknüpfung von Relationen mit Subqueries (5/7) 34. Namen aller Angestellten, die an mindestens einem Projekt in Karlsruhe mitarbeiten. Vorgehensweise: a) in projekt: Auswahl P-NR der Projekte in Karlsruhe b) in ang-pro: Auswahl ANG-NR, deren P-NR in der obigen Ergebnismenge liegen c) in angestellte: Auswahl Tupel mit o. best. ANG-NR c)SELECT NAME FROM angestellte WHERE ANG-NR IN b)(SELECT ANG-NR FROM ang-pro WHERE P-NR IN a)(SELECT P-NR FROM projekt WHERE P-FILIALE =Karlsruhe)); Mehrfach geschachtelte Queries Animation und Ergebnis dieses Beispiels (siehe Seite 72)
SQL - Structured Query Language AIFB SS (6/7) Verknüpfung von Relationen mit Subqueries (6/7) SELECTa.NAME FROMangestellte a, ang-pro ap, projekt p WHEREa.ANG-NR = ap.ANG-NR AND ap.P-NR=p.P-NR AND P-FILIALE=Karlsruhe 35. äquivalente Formulierung mit 2-fach Join:
SQL - Structured Query Language AIFB SS (7/7) Verknüpfung von Relationen mit Subqueries (7/7) Correlated subquery: Subquery bezieht Größen der umgebenden äußeren Query ein (als Variablen). : 36. Gib alle Orte an, an denen mehr als ein Projekt angesiedelt ist. b)SELECT DISTINCT P-FILIALE FROM projekt a WHERE 1 < a)(SELECT COUNT (*) FROM projekt b WHERE b.P-FILIALE = a.P-FILIALE Jetzt: b) kann nicht vorab ausgewertet werden, da abhängig von P-Filiale aus a). Animation und Ergebnis dieses Beispiels (siehe Seite 73)
SQL - Structured Query Language AIFB SS Beispiel für Mehrfach geschachtelte Queries SELECT NAME FROM angestellte WHERE ANG-NR IN angestellte (#=n) ANG-NRNAMEWOHNORTABT-NR 3115MeyerKarlsruhe MüllerMannheim KleinMannheim MausKarlsruhe GroßKarlsruhe SchmittHeidelberg MayerleinBruchsal MüllerKarlsruhe SchulzBruchsal KrämerLudwigshafen MeierPforzheim SchusterWorms31 projekt (#=k) P-NAMEP-NRP-FILIALEP-LEITER p Karlsruhe3115 p Karlsruhe3115 p Heidelberg1324 P Mannheim2814 ang-pro (#=m) P-NRANG-NRPROZ-ARBZEIT (SELECT P-NR FROM projekt WHERE P-FILIALE =Karlsruhe)); (SELECT ANG-NR FROM ang-pro WHERE P-NR IN Ergebnis: NAME Meyer Müller Klein Maus Mayerlein Krämer Meier Schuster
SQL - Structured Query Language AIFB SS Beispiel für Correlated subquery SELECTDISTINCT P-FILIALE FROMprojekt a WHERE1 < (SELECT COUNT (*) FROM projekt b WHERE b.P-FILIALE = a.P-FILIALE); projekt a P-NAMEP-NRP-FILIALEP-LEITER p Karlsruhe3115 p Karlsruhe3115 p Heidelberg1324 P Mannheim2814 Ergebnis: P-FILIALE Kalrsruhe projekt b P-NAMEP-NRP-FILIALEP-LEITER p Karlsruhe3115 p Karlsruhe3115 p Heidelberg1324 P Mannheim