子查询与相关子查询之间的区别

时间:2013-06-24 05:59:19

标签: sql sql-server subquery correlated-subquery

以下SQL查询是普通查询还是相关子查询?

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

此外,有人可以说明两者之间的区别

7 个答案:

答案 0 :(得分:76)

以上示例不是与Co相关的子查询。它是Derived Table / Inline-View,因为即FROM子句中的子查询。

Corelated子查询应该引用其父(主查询)表。例如,请参阅Co-related Sub-query找到第N个最高工资:

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

Co-Related Vs Nested-SubQueries。

Normal Sub-query和Co-related子查询之间的技术差异是:

<强> 1。循环:     主查询下的共同相关子查询循环;而不是嵌套;因此,在主查询的每次迭代中执行共同相关的子查询。而在嵌套查询的情况下;子查询首先执行,然后执行外部查询。因此,最大的没有。执行的是NXM用于相关子查询,N + M用于子查询。

<强> 2。依赖性(内部对外部与外部对内部):     在共同相关子查询的情况下,内部查询依赖于外部查询进行处理,而在正常的子查询中,外部查询依赖于内部查询。

<强> 3.性能:     使用Co相关的子查询性能降低,因为它执行NXM迭代而不是N + M次迭代。 ¨与相关的子查询执行。

有关示例的更多信息:

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

答案 1 :(得分:43)

相关子查询是使用外部查询中的值的子查询。在这种情况下,必须对外部查询的每一行执行内部查询。

请参阅此处示例http://en.wikipedia.org/wiki/Correlated_subquery

简单子查询不使用外部查询中的值,只计算一次:

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

CoRelated子查询示例 -

查询查找薪水高于其部门平均值的所有员工

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

答案 2 :(得分:6)

相关子查询:针对主查询处理的每一行进行评估。根据外部查询提取的值执行Inner查询。继续,直到主查询返回的所有值都匹配。 INNER查询由OUTER查询

驱动

例如:

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

Correlated子查询专门计算每个部门的AVG(sal)

SUBQUERY:首先运行,执行一次,返回MAIN查询要使用的值。 OUTER查询由INNER QUERY

驱动

答案 3 :(得分:6)

子查询是一个嵌入在另一个select语句的子句中的select语句。

EX:

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

相关子查询是一个子查询,对外部查询或主查询处理的每一行计算一次子查询。根据Outer查询获取的值执行Inner查询,匹配主查询返回的所有值。 INNER查询由OUTER查询驱动。

例如:

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

差分

内部查询首先执行并找到一个值,外部查询使用内部查询(子查询)中的值执行一次

通过外部查询获取,使用外部查询的值执行内部查询,使用内部查询产生的值来限定或取消外部查询的资格(相关)

有关详细信息: http://www.oraclegeneration.com/2014/01/sql-interview-questions.html

答案 4 :(得分:2)

当涉及到子查询和共同相关的查询时,内部查询和外部查询的唯一区别在于子查询中内部查询不依赖于外部查询,而在共同相关的内部查询中依赖于外部查询。

答案 5 :(得分:1)

我认为下面的解释会对你有所帮助..  区分那些: Correlated subquery是主查询(外部查询)引用的内部查询,以便内部查询被视为重复执行。

non-correlated subquery是一个独立于外部查询的子查询,它可以独立执行,而不依赖于主外部查询。

plain subquery不依赖于外部查询

答案 6 :(得分:0)

在SQL查询中,如果内部查询针对外部查询的每一行执行。如果内部查询执行一次并且结果被外部查询使用,那么它将被称为非共同相关查询。

Correlated sub-queries usually correspond to normal join queries, i.e. join queries that have no sub-queries, and can usually be expressed as such. It is sometimes recommended that they are translated into such join queries, because most SQL DBMSs will execute them .....