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 <E2.Salary)
Co-Related Vs Nested-SubQueries.
Der technische Unterschied zwischen normaler Sub-Query und Co-Related-Sub-Query sind:
1. Schleifen: Co-bezogene Unterabfragen werden in einer Schleife unter der Hauptabfrage ausgeführt, während geschachtelte Unterabfragen nicht ausgeführt werden; daher werden Co-bezogene Unterabfragen bei jeder Iteration der Hauptabfrage ausgeführt. Im Falle einer geschachtelten Abfrage hingegen wird die Unterabfrage zuerst ausgeführt und dann die äußere Abfrage als nächstes. Daher ist die maximale Anzahl der Ausführungen NXM für korrelierte Unterabfragen und N+M für Unterabfragen.
2. Abhängigkeit (Inner to Outer vs Outer to Inner): Im Falle einer ko-korrelierten Subquery hängt die innere Abfrage von der äußeren Abfrage ab, während bei einer normalen Subquery die äußere Abfrage von der inneren Abfrage abhängt.
3.Leistung: Bei der Verwendung von Co-related Sub-Queries sinkt die Leistung, da sie NXM Iterationen statt N+M Iterationen durchführt. ¨ Co-related Sub-Query Execution.
Für weitere Informationen mit Beispielen:
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);
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,