Unterschied zwischen Subquery und Correlated Subquery

Ist die folgende SQL-Abfrage eine normale Abfrage oder eine "Correlated Subquery"?

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 mir jemand den Unterschied zwischen den beiden Abfragen erklären?

Das obige Beispiel ist keine zusammenhängende Sub-Query. Es handelt sich um eine abgeleitete Tabelle / Inline-View, d.h. eine Unterabfrage innerhalb der FROM-Klausel.

Eine korellierte Unterabfrage sollte auf die übergeordnete Tabelle (Hauptabfrage) verweisen. Beispiel: Finde das N-te maximale Gehalt durch eine korellierte Unterabfrage:


SELECT Salary 
FROM Employee E1
WHERE N-1 = (SELECT COUNT(*)
             FROM Employee E2
             WHERE E1.salary 
Kommentare (4)
Lösung

Correlated Subquery 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.

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

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 Subquery Beispiel -

Abfrage zum Finden aller Mitarbeiter, deren Gehalt über dem Durchschnitt ihrer Abteilung liegt

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

Ich denke, die folgende Erklärung wird Ihnen helfen. Unterscheidung zwischen diesen: Korrelierte Unterabfrage" ist eine innere Abfrage, die von der Hauptabfrage (äußere Abfrage) referenziert wird, so dass die innere Abfrage als wiederholt ausgeführt betrachtet wird.

Nicht-korrelierte Unterabfrage" ist eine Unterabfrage, die unabhängig von der äußeren Abfrage ist und selbständig ausgeführt werden kann, ohne auf die äußere Hauptabfrage angewiesen zu sein.

Die "einfache Unterabfrage" ist nicht von der äußeren Abfrage abhängig,

Kommentare (1)