90 likes | 220 Views
2.3.8 Verknüpfung von Relationen mit Subqueries (1/7). (das sind geschachtelte Queries) anstelle von Join. 32. „ Namen aller Angestellten, die mit 100 % ihrer Arbeitszeit an einem Projekt mitarbeiten .“
E N D
2.3.8 Verknüpfung von Relationen mit Subqueries (1/7) (das sind geschachtelte Queries) anstelle von Join • 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) SELECTFROMWHERE ANG-NR ang-pro SQL - Structured Query Language Ó AIFB PROZ-ARBZEIT=100; Ergebnis:
2.3.8 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) SELECTFROMWHERE NAME angestellte ANG-NR IN (3207, 2412, 2314,1324); SQL - Structured Query Language Ó AIFB Ergebnis:
2.3.8 Verknüpfung von Relationen mit Subqueries (3/7) Zusammenfassung zu geschachtelter Query: {äußere Query b} SELECT NAMEFROM angestellte WHERE ANG-NR IN {Subquery a}(SELECT ANG-NR FROM ang-proWHERE 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 SQL - Structured Query Language Ó AIFB
2.3.8 Verknüpfung von Relationen mit Subqueries (4/7) 33. Äquivalente Abfrage mit Join: • SELECT NAME FROM angestellte, ang-pro WHERE PROZ-ARBZEIT = 100 AND ang-pro.ANG-NR = angestellte.ANG-NR; SQL - Structured Query Language Ó AIFB Ergebnis von 32. SELECT NAMEFROM angestellte WHERE ANG-NR IN(SELECT ANG-NR FROM ang-proWHERE PROZ-ARBZEIT = 100) Vergleich 32. mit 33.: (vereinfachte Betrachtung!) man betrachte Anzahl der notwendigen DB-Zugriffe! bei 32.: n+m bei 33.: nm
2.3.8 Verknüpfung von Relationen mit Subqueries (5/7) Mehrfach geschachtelte Queries • 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-proWHERE P-NR IN • a) (SELECT P-NR FROM projekt WHERE P-FILIALE =‘Karlsruhe‘)); SQL - Structured Query Language Ó AIFB Animation und Ergebnis dieses Beispiels (siehe Seite 72)
2.3.8 Verknüpfung von Relationen mit Subqueries (6/7) 35. äquivalente Formulierung mit 2-fach Join: • SELECT a.NAMEFROM angestellte a, ang-pro ap, projekt p WHERE a.ANG-NR = ap.ANG-NR AND ap.P-NR=p.P-NR AND P-FILIALE=‘Karlsruhe‘ SQL - Structured Query Language Ó AIFB
2.3.8 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-FILIALEFROM projekt a WHERE 1 < a) (SELECTCOUNT (*) FROM projekt b WHERE b.P-FILIALE = a.P-FILIALE SQL - Structured Query Language Ó AIFB Jetzt: b) kann nicht vorab ausgewertet werden, da abhängig von P-Filiale aus a). Animation und Ergebnis dieses Beispiels (siehe Seite 73)
Beispiel für Mehrfach geschachtelte Queries Ergebnis: • SELECT NAME FROM angestellte WHERE ANG-NR IN (SELECT ANG-NRFROM ang-proWHERE P-NR IN (SELECT P-NRFROM projekt WHERE P-FILIALE =‘Karlsruhe‘)); SQL - Structured Query Language Ó AIFB
1 1 Beispiel für „Correlated subquery“ • SELECT DISTINCT P-FILIALE FROM projekt a WHERE 1 < (SELECTCOUNT (*) FROM projekt b WHERE b.P-FILIALE = a.P-FILIALE); SQL - Structured Query Language Ó AIFB 2 Ergebnis: