it-swarm.com.de

Unterschied zwischen Unterabfrage und korrelierter Unterabfrage

Ist der folgende Teil der SQL-Abfrage eine normale Abfrage oder eine korrelierte Unterabfrage?

SELECT UserID,
       FirstName,
       LastName,
       DOB,
       GFName,
       GLName,
       LoginName,
       LoginEffectiveDate,
       LoginExpiryDate,
       Password,
       Email,
       ReportingTo,
       Mobile,
       CommunicationPreference,
       IsActive
FROM   (SELECT row_number() OVER (ORDER BY FirstName) AS Row,
               UserID,
               FirstName,
               LastName,
               DOB,
               GFName,
               GLName,
               LoginName,
               LoginEffectiveDate,
               LoginExpiryDate,
               Password,
               Email,
               ReportingTo,
               Mobile,
               CommunicationPreference,
               IsActive
        FROM   DivakarUserRegistration)  T

Kann jemand auch den Unterschied zwischen den beiden angeben

37
Divakar

Korrelierte Unterabfrage ist eine Unterabfrage, die Werte aus der äußeren Abfrage verwendet. In diesem Fall muss die innere Abfrage für jede Zeile der äußeren Abfrage ausgeführt werden. 

Beispiel siehe hier http://en.wikipedia.org/wiki/Correlated_subquery

Die einfache Unterabfrage verwendet keine Werte aus der äußeren Abfrage und wird nur einmal berechnet:

SELECT id, first_name 
FROM student_details 
WHERE id IN (SELECT student_id
FROM student_subjects 
WHERE subject= 'Science'); 

CoRelated-Unterabfragebeispiel - 

Abfrage an Alle Mitarbeiter finden, deren Gehalt für ihre Abteilung überdurchschnittlich ist

 SELECT employee_number, name
       FROM employees emp
       WHERE salary > (
         SELECT AVG(salary)
           FROM employees
           WHERE department = emp.department);
41
Alex

Das obige Beispiel ist keine Co-bezogene Unterabfrage. Dies ist eine abgeleitete Tabelle/Inline-Ansicht, da eine Unterabfrage innerhalb der FROM-Klausel vorliegt.

Eine korelierte Unterabfrage sollte auf ihre übergeordnete (Hauptabfragetabelle) darin verweisen. Beispiel: Finden Sie das N-te Max-Gehalt anhand der Co-bezogenen Unterabfrage:

SELECT Salary 
FROM Employee E1
WHERE N-1 = (SELECT COUNT(*)
             FROM Employee E2
             WHERE E1.salary <E2.Salary) 

Co-Related Vs Nested-SubQueries.

Der technische Unterschied zwischen der normalen Unterabfrage und der zusammengehörigen Unterabfrage ist:

1. Looping: Co-bezogene Unterabfrageschleife unter Hauptabfrage; geschachtelt nicht; Daher wird eine zusammengehörige Unterabfrage bei jeder Iteration der Hauptabfrage ausgeführt. Bei verschachtelten Abfragen. Unterabfrage wird zuerst ausgeführt, dann Außenabfrage als Nächstes. Daher das Maximum nein. der Ausführungen sind NXM für korrelierte Unterabfragen und N + M für Unterabfragen.

2. Abhängigkeit (Innen nach Außen vs. Außen nach Innen): Bei einer zusammengehörigen Unterabfrage hängt die innere Abfrage von der äußeren Abfrage ab, während bei einer normalen Unterabfrage die äußere Abfrage von der inneren Abfrage abhängt.

3.Performance: Durch die Verwendung der zusammengehörigen Unterabfrageleistung nimmt die Leistung ab, da NXM-Iterationen anstelle von N + M-Iterationen ausgeführt werden. ¨ Co-bezogene Unterabfrageausführung.

Weitere Informationen mit Beispielen: 

http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-Sql-Sub-Queries-Nested-Co-related.html

Eine Unterabfrage ist eine select-Anweisung, die in eine Klausel einer anderen select-Anweisung eingebettet ist.

EX: 

select ename, sal 
from emp  where sal > (select sal 
                       from emp where ename ='FORD');

Eine korrelierte Unterabfrage ist eine Unterabfrage, die einmal für jede von der äußeren Abfrage oder Hauptabfrage verarbeitete Zeile ausgewertet wird. Führen Sie die innere Abfrage basierend auf dem von der äußeren Abfrage abgerufenen Wert aus. Alle von der Hauptabfrage zurückgegebenen Werte stimmen überein. Die INNER-Abfrage wird von der OUTER-Abfrage gesteuert.

Ex:

select empno,sal,deptid 
from emp e 
where sal=(select avg(sal) 
           from emp where deptid=e.deptid);

UNTERSCHIED

Die innere Abfrage wird zuerst ausgeführt und findet einen Wert. Die äußere Abfrage wird einmal ausgeführt, wobei der Wert aus der inneren Abfrage (Unterabfrage) verwendet wird.

Abrufen durch die äußere Abfrage. Führen Sie die innere Abfrage mit dem Wert der äußeren Abfrage aus. Verwenden Sie die aus der inneren Abfrage resultierenden Werte, um die äußere Abfrage zu qualifizieren oder zu disqualifizieren (korreliert).

Weitere Informationen:http://www.oraclegeneration.com/2014/01/sql-interview-questions.html

6
Brahmareddy K

Korrelierte Unterabfragen: Wird für jede von der Hauptabfrage verarbeitete Zeile ausgewertet. Führen Sie die innere Abfrage basierend auf dem von der äußeren Abfrage abgerufenen Wert aus. Fährt fort, bis alle von der Hauptabfrage zurückgegebenen Werte übereinstimmen. Die INNER-Abfrage wird von der OUTER-Abfrage gesteuert

Ex:

SELECT empno,fname,sal,deptid FROM emp e WHERE sal=(SELECT AVG(sal) FROM emp WHERE deptid=e.deptid)

Die korrelierte Unterabfrage berechnet speziell die AVG(sal) für jede Abteilung.

SUBQUERY: Läuft zuerst, wird einmal ausgeführt und gibt die von der MAIN-Abfrage zu verwendenden Werte zurück. Die OUTER-Abfrage wird von der INNER-Abfrage gesteuert

6
Kumaran

bei Unterabfragen und zusammengehörigen Abfragen haben beide eine innere Abfrage und eine äußere Abfrage. Der einzige Unterschied besteht in der Unterabfrage. Die innere Abfrage hängt nicht von der äußeren Abfrage ab, wohingegen bei der zusammengehörigen inneren Abfrage die äußere Abfrage abhängt. 

2
Prashanth S R

Ich denke, die folgende Erklärung wird Ihnen helfen ... Unterscheidung zwischen denen: Correlated subquery ist eine innere Abfrage, auf die durch die Hauptabfrage (äußere Abfrage) verwiesen wird, so dass die innere Abfrage als wiederholt betrachtet wird.

non-correlated subquery ist eine von der äußeren Abfrage unabhängige Unterabfrage, die eigenständig ausgeführt werden kann, ohne sich auf die äußere Hauptabfrage zu verlassen.

plain subquery ist nicht von der äußeren Abfrage abhängig. 

1
rcmuthu786

Wenn in einer SQL-Abfrage die innere Abfrage für jede Zeile der äußeren Abfrage ausgeführt wird. Wenn die innere Abfrage einmal ausgeführt wird und das Ergebnis von der äußeren Abfrage verwendet wird, wird sie als nicht zusammengehörige Abfrage aufgerufen.

Korrelierte Unterabfragen entsprechen normalerweise normalen Verknüpfungsabfragen, d. H. Verknüpfungsabfragen, die keine Unterabfragen haben, und können normalerweise als solche ausgedrückt werden. Es wird manchmal empfohlen, dass sie in solche Join-Abfragen übersetzt werden, da die meisten SQL-Datenbankverwaltungssysteme sie ausführen werden ...