Wie EXISTIERT die Arbeit in Oracle, und wie unterscheidet es sich von IN?
Ich habe Schwierigkeiten zu verstehen, die Klausel Existiert, während das Lesen eines oracle-Buch. Hier ist das 3 Bild habe ich aus dem Buch.
Dies ist der 1. sql-Anweisung mit der IN-Klausel, ich habe keine Probleme es zu verstehen.
Dies ist die 2. sql-Anweisung mithilfe des EXISTS-Klausel, verstehe ich nicht, warum es alle Zeilen, während es ist eine Bedingung DEPTNO > 20.
Dies ist das 3. sql-Anweisung, die immer die gleichen Zeilen wie in der 1. sql-Anweisung verwenden, benötigen Sie eine zusätzliche Verknüpfung der zwei Tabellen und ich kann mich nicht Grund.
Ich habe versucht, google "EXISTIERT ORACLE", aber die meisten der Seite erklären den Unterschied zwischen EXISTIERT, und IN, aber nicht zu erklären, wie Sie EXISTIERT die Arbeit. Würde Euch die Mühe, es zu erklären?
- Eine gute Angewohnheit, in zu erhalten, wenn es schriftlich VORHANDEN ist, Klauseln, ist nie auf etwas sinnvolles - z.B.
WHERE EXISTS (SELECT null FROM ...
- ich finde einige Menschen sind verwirrt mit EXISTS-Klauseln, weil Sie denken, dass Sie eine Spalte ausgewählt werden muss. - Yup, hab ich schon gelernt, aber danke, dass Sie alle das gleiche. Und vielen Dank, dass meine Aufmerksamkeit auf diese, so dass ich das löschen kann meinen verwirrenden Kommentar.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine ziemlich ausführliche Erklärung der beiden und wie Sie entscheiden, welche zu benutzen:
http://www.techrepublic.com/article/oracle-tip-understand-the-difference-between-in-and-exists-in-subqueries/5297080
Exists prüft ob die Unterabfrage, die ein Ergebnis zurückgibt. Im Grunde, wenn man die Unterabfrage und führen Sie es durch sich selbst, wenn es mindestens eine Zeile zurückgibt, dann ist die Bedingung wahr ist. Die Dritte Abfrage fügt eine zweite Bedingung, dass links die Unterabfrage auf die übergeordnete Abfrage, damit es prüft, ob eine bestimmte person hat eine Abteilung mit deptno > 20
Die zweite Abfrage gibt alle Zeilen, denn es ist nicht korreliert (zusammenhängt) zu der primären Tabelle, und das Ergebnis ist größer als 0. Die Dritte Abfrage ist eine korrelierte sub-query ( E. DeptNo=), das ist der Grund, warum es retuns das gleiche Ergebnis wie die erste Abfrage.
Des EXIST-Klausel sagt, um die Abfrage auszuführen, zu stoppen, sobald es findet die erste übereinstimmung. Wenn es eine übereinstimmung findet, gibt es true zurück, wenn nicht, gibt Sie false zurück. Die Abfrage braucht nicht (und in Ihrem zweiten Fall nicht) verknüpft werden, um die primäre Abfrage.