SQL Query erstellen (Nested Loop=

Aufrufe: 1229     Aktiv: 28.06.2021 um 09:32

0

Hallo zusammen

Nun habe ich zwei Queries nun weiss ich nicht, wie ich ein NESTED-QUERY erstellen soll. Wie macht man so etwas? Wie kriege ich die bottom 10 mit ORDER BY DESC?

enter image description here

Vielen Dank!

Schöne Grüsse Sayuri

Sql
Diese Frage melden
gefragt

Student, Punkte: 66

 
Kommentar schreiben
2 Antworten
0

Mit "10 ROWS ONLY" kriegst du wahrscheinlich zehn Zeilen. Dann musst du die gewünschte Spalte sortieren ("ORDER BY"). Um die letzten zehn zu kriegen (du schreibst: "bottom 10") könntest du vermutlich statt des Keywords "DESC" (= descending, also absteigend) das Keyword "ASC" (=ascending, aufsteigend) verwenden.

Nested-Queries sind einfach zwei (oder mehr) ineinander verschachtelte Queries.

SELECT column_name [, column_name ] FROM table1 [, table2 ] WHERE column_name OPERATOR (SELECT column_name [, column_name ] FROM table1 [, table2 ] [WHERE])

(Siehe hierzu z.B. Erläuterungen unter https://www.tutorialspoint.com/sql/sql-sub-queries.htm ).

Diese Antwort melden
geantwortet

Punkte: 25

 

Danke dir für deine Antwort. :)

  ─   sayuri 26.06.2021 um 09:55

Kommentar schreiben

0

Grundsätzlich gilt für Nested Queries:

Das Ergebnis der Nested Query wird als Baustein für die Basic Query benötigt

Das heißt für dein Beispiel: Der gerundete Durchschnittswert aus der zweiten Abfrage wird als Baustein für die erste Abfrage benötigt.

Die Aufgabenstellung als solche ist ganz schön tricky; du wirst also nur "nach Fahrplan" die richtige Abfrage finden, und das auch erst ganz am Ende.

Vorschlag für den Fahrplan:

  1. Finde die "bottom 10 collisions in terms of average victim age" (Nested Query)
  2. In der Basic Query: finde die Stelle, wo das Ergebnis der Nested Query gebraucht wird
  3. Bau die Nested Query an dieser Stelle in die Basic Query ein. ( SELECT ... ; ); Klammern nicht vergessen.
  4. Korrigiere die kombinierte Abfrage, bis du das gewünschte Ergebnis hast.

Und ... ich fürchte, dass du am Ende doppelt schachteln musst. Das meinte ich mit "tricky". Folge dem Fahrplan von innen nach außen, und du bist auf der sicheren Seite:

SELECT ...  ( SELECT ... ( SELECT ...{Schritt 1}... ; ) {Schritt 2} ... ; ) {Schritt 3} ... ;

Viel Erfolg!

Perrin

Diese Antwort melden
geantwortet

Punkte: 10

 

Vielen Dank für deine Antwort. Kannst du mir noch Allg. Tipps geben, bei welchen Fragestellung man nested query verwendet? Da bin ich mir nicht sicher...

  ─   sayuri 26.06.2021 um 09:54

Hallo, sayuri!

Also mir fallen auf die Schnelle (nach 20 Jahren im Umgang mit Datenbanken) nur zwei allgemeine Fälle ein:

1. Überall dort, wo eine WHERE-Klausel abhängig ist vom Ergebnis einer weiteren Abfrage
2. ... was beinahe immer dann passiert, wenn die WHERE-Klausel vom Ergebnis einer Aggregatsfunktion abhängt: COUNT(), AVG(), MIN(), MAX() ... usw.

So eine tricky Sache wie in deiner Aufgabe kommt in der Praxis aber nur sehr selten vor und wird dann meistens über eine Sprache wie Python oder R gelöst. Ganz einfach weil "quick and comprehensible" in der freien Wirtschaft immer besser ankommt als "artful and sophisticated".

LG, Perrin

  ─   perrinhh 26.06.2021 um 12:14

Danke dir! Z.B. bei dieser Aufgabe dachte ich nicht, warum ich einen Nested query benutzen soll. Siehst du ein Schema?

Find the age of the oldest student who is either an electrical engineer (major = EE) or is enrolled in a course taught by Prof. ‘Newton Totten’.

SELECT MAX(S.age)
FROM Student S
WHERE (S.major = 'EE') OR
S.snum IN ( SELECT E.snum
FROM Course C, Enrolled E, Faculty F
WHERE E.cname = C.cname AND C.fid = F.fid AND F.fname = 'Newton Totten')


oder hier

Find the names of all courses that either meet in room R128 or have 5 or more students enrolled.

SELECT C.cname
FROM Course C
WHERE C.room = ‘R128’ OR
C.cname IN ( SELECT E.cname
FROM Enrolled E
GROUP BY E.cname
HAVING COUNT (*) >= 5)

Oder hier:

SELECT DISTINCT S.sname
FROM Student S
WHERE S.snum IN ( SELECT E1.snum
FROM Enrolled E1, Enrolled E2, Course C1, Course C2
WHERE E1.snum = E2.snum AND E1.cname <> E2.cname AND E1.cname = C1.cname AND E2.cname = C2.cname
AND C1.meets_at = C2.meets_at)

Das verstehe ich überhaupt: Hast du hier vielleicht eine Idee, warum dies so geschrieben ist?

Find the names of faculty members who teach in every room in which some course is taught.

SELECT DISTINCT F.fname
FROM Faculty F
WHERE (SELECT COUNT(distinct C.room)
FROM Course C) =
(SELECT COUNT(distinct C1.room)
FROM Course C1
WHERE C1.fid = F.fid)

  ─   sayuri 27.06.2021 um 12:38

Frag dich ganz einfach, wo die Werte herkommen, die du in die WHERE-Klausel einfügen musst. Hast du diese Werte? Dann schreib sie rein! Brauchst du eine weitere SQL-Abfrage, um an die Werte heranzukommen? Dann mach eine Nested Query draus. Das ist das Muster.

LG, Perrin.

  ─   perrinhh 27.06.2021 um 21:39

Danke dir! Weiteren Fragen habe ich noch, weisst du warum dieses Query so aussieht? Verstehe die verschachtelte Variante nicht. Kennst du dich mit hash index, B+ index aus?

Find the names of faculty members who teach in every room in which some course is taught.

SELECT DISTINCT F.fname
FROM Faculty F
WHERE (SELECT COUNT(distinct C.room)
FROM Course C) =
(SELECT COUNT(distinct C1.room)
FROM Course C1
WHERE C1.fid = F.fid)

  ─   sayuri 28.06.2021 um 09:32

Kommentar schreiben