2016-11-01 3 views
0

Ich versuchte zu verstehen, wie verschachtelte oder verschachtelte Unterabfragen in Oracle arbeiten, wenn Sie mit SQL arbeiten. Nehmen wir ein Beispiel, wo ich zwei Tische habe, einen mit allen Informationen für Schüler und einen mit allen Noten, die jeder Schüler erhalten hat. Jetzt versuche ich alle Schüler zu finden, die mindestens eine A-Note von der Noten-Tabelle erhalten haben. Ich kann einen einfachen Join machen und die Ausgabe dafür bekommen. Aber das Problem ist, wenn ein Schüler zweimal eine Note "A" erhalten hat, wird seine ID zweimal angezeigt. Jetzt weiß ich, dass ich das DISTINCT-Wort verwenden kann, um mein Problem zu lösen. Aber ich wollte dies mit geschachtelten Abfragen tun und so habe ich getippt -> ID von Studenten wählen, wo ID in (wählen Sie ID aus Noten); Nun gibt diese Abfrage eine Ausgabe ohne Duplikate zurück. Ich versuche, meinen Kopf darüber zu bekommen und wie diese verschachtelte Abfrage im Detail funktioniert. Was macht der "Where in" -Teil auch? Wirklich verwirrt.Arbeiten der Unterabfrage in SQL Oracle

+0

(1) Ich entfernte die unpassenden Datenbank-Tags. (2) Sie sollten die Frage bearbeiten und Beispieldaten und gewünschte Ergebnisse bereitstellen. –

Antwort

0

Während es nicht allgemein gilt, dass eine distinct eine schlechte Sache ist, wird es oft missbraucht - und ich denke, Ihr Beispiel ist ein guter, wo es einen besseren Weg gibt.

In diesem Fall denke ich, Ihre beste Wette ist ein Semi-Join. Hier ist ein einfaches Beispiel:

select s.* 
from students s 
where exists (
    select null 
    from grades g 
    where 
    s.student_id = g.student_id and 
    g.grade = 'A' 
) 

Oracle hat einen ziemlich guten Job von einer Unterabfrage in eine Semi-Join im Hintergrund ausgeführt wird, wenn es Sinn macht, aber auch andere DBMS auf jeden Fall von diesem Konstrukt profitieren.

+0

Ja. Vielen Dank für Ihre Antwort! Ich verstehe jetzt :) –

0

Eigentlich ist es ein Join und ein Unterscheidungsmerkmal - aber Oracle ist schlau, es macht es effizient. Es tut was Sie tun würden: es nimmt die erste student_id aus der ersten Tabelle, und es versucht, es gegen Zeilen in der zweiten Tabelle zu vergleichen. Da Sie jedoch den gesamten Join nicht benötigen, wird er angehalten, sobald er eine Übereinstimmung findet. Dann wird die zweite Zeile in der ersten Tabelle angezeigt.

Ich nehme an, du meinst die Unterabfrage select id from grades where grade = 'A', richtig?

+0

Ja. Vielen Dank für Ihre Antwort! Ich verstehe jetzt :) –