web-dev-qa-db-fra.com

Différence entre sous-requête et sous-requête corrélée

La requête SQL suivante est-elle une requête normale ou une sous-requête corrélée?

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

Aussi, quelqu'un peut-il faire la différence entre les deux

37
Divakar

La sous-requête corrélée est une sous-requête qui utilise les valeurs de la requête externe. Dans ce cas, la requête interne doit être exécutée pour chaque ligne de la requête externe. 

Voir l'exemple ici http://en.wikipedia.org/wiki/Correlated_subquery } _

La sous-requête simple n'utilise pas les valeurs de la requête externe et est calculée une seule fois:

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

Exemple de sous-requête CoRelated - 

Requête pour trouver tous les employés dont le salaire est supérieur à la moyenne pour leur département

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

L'exemple ci-dessus n'est pas une sous-requête liée à la corrélation. C’est une table dérivée/vue en ligne puisque c’est-à-dire une sous-requête dans la clause FROM.

Une sous-requête corrélée doit faire référence à sa table parent (requête principale). Voir, par exemple, Trouver le salaire Nth max par requête secondaire:

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

Co-Related Vs Nested-SubQueries.

Les différences techniques entre les sous-requêtes normales et les sous-requêtes associées sont les suivantes:

1. Boucle: Boucle de sous-requête co-liée sous la requête principale; alors niché pas; par conséquent, une sous-requête corrélée est exécutée à chaque itération de la requête principale. Attendu que dans le cas d'une requête imbriquée; la sous-requête s'exécute en premier, puis la requête externe est exécutée ensuite. Par conséquent, le maximum non. des exécutions sont NXM pour la sous-requête corrélée et N + M pour la sous-requête.

2. Dépendance (intérieure à extérieure vs extérieure à intérieure): Dans le cas d'une sous-requête liée, la requête interne dépend de la requête externe pour le traitement, tandis que dans la sous-requête normale, la requête externe dépend de la requête interne.

3.Performance: L'utilisation des performances des sous-requêtes associées aux co-reliées diminue car elle effectue des itérations NXM au lieu d'itérations N + M. ¨ Exécution d'une sous-requête associée.

Pour plus d'informations avec des exemples: 

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

74

Une sous-requête est une instruction select intégrée à la clause d'une autre instruction select.

EX: 

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

Une sous-requête corrélée est une sous-requête qui est évaluée une fois pour chaque ligne traitée par la requête externe ou la requête principale. Exécutez la requête interne en fonction de la valeur extraite par la requête externe. Toutes les valeurs renvoyées par la requête principale sont mises en correspondance. La requête INNER est pilotée par la requête OUTER.

Ex:

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

DIFFÉRENCE

La requête interne s'exécute en premier et trouve une valeur, la requête externe s'exécute une fois à l'aide de la valeur de la requête interne (sous-requête)

Récupération par la requête externe, exécution de la requête interne à l'aide de la valeur de la requête externe, utilisation des valeurs résultant de la requête interne pour qualifier ou disqualifier la requête externe (corrélée)

Pour plus d'informations:http://www.oraclegeneration.com/2014/01/sql-interview-questions.html

6
Brahmareddy K

en ce qui concerne les sous-requêtes et les requêtes associées, les requêtes internes et externes, la seule différence est que, dans la sous-requête, la requête interne ne dépend pas de la requête externe, alors que dans la requête interne, la corrélation est externe. 

2
Prashanth S R

Je pense que l'explication ci-dessous vous aidera ... différenciation entre ceux-ci: Correlated subquery est une requête interne référencée par la requête principale (requête externe) telle que la requête interne est considérée comme ayant été exécutée à plusieurs reprises.

non-correlated subquery est une sous-requête indépendante de la requête externe et peut être exécutée seule sans recourir à la requête externe principale.

plain subquery ne dépend pas de la requête externe, 

1
rcmuthu786

Dans une requête SQL, si la requête interne s'exécute pour chaque ligne de la requête externe. Si la requête interne est exécutée une fois et que le résultat est consommé par la requête externe, il est alors appelé requête non liée.

Les sous-requêtes corrélées correspondent généralement aux requêtes de jointure normales, c'est-à-dire aux requêtes de jointure ne comportant aucune sous-requête et pouvant généralement être exprimées en tant que telles. Il est parfois recommandé de les traduire en de telles requêtes de jointure, car la plupart des SGBD SQL les exécuteront .....