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

Div*_*kar 43 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
Run Code Online (Sandbox Code Playgroud)

此外,有人可以说明两者之间的差异

nay*_*ies 78

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

Corelated子查询应该引用其父(主查询)表.例如,请参阅Co-related Sub-query查找Nth max salary:

SELECT Salary 
FROM Employee E1
WHERE N-1 = (SELECT COUNT(*)
             FROM Employee E2
             WHERE E1.salary <E2.Salary) 
Run Code Online (Sandbox Code Playgroud)

Co-Related Vs Nested-SubQueries.

Normal子查询和Co相关子查询之间的技术差异是:

1.循环: 主查询下的Co相关子查询循环; 而不是嵌套; 因此,在主查询的每次迭代中执行共同相关的子查询.而在嵌套查询的情况下; 子查询首先执行,然后执行外部查询.因此,最大的没有.执行的是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

  • @nayeemDotNetAutorities"以上示例不是与Co相关的子查询"?这是什么?如果它与其他答案相关,那么Plz在回答另一个答案时不会使用这些相对术语.因为现在可能会在以后更改. (7认同)

Ale*_*lex 48

Correlated Subquery是一个子查询,它使用外部查询中的值.在这种情况下,必须对外部查询的每一行执行内部查询.

请参阅此处的示例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'); 
Run Code Online (Sandbox Code Playgroud)

CoRelated子查询示例 -

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

 SELECT employee_number, name
       FROM employees emp
       WHERE salary > (
         SELECT AVG(salary)
           FROM employees
           WHERE department = emp.department);
Run Code Online (Sandbox Code Playgroud)

  • 那里没有相关的子查询 (10认同)
  • 我在提供的示例中没有看到相关子查询。 (2认同)

小智 6

CORRELATED SUBQUERIES:对主查询处理的每一行进行评估.根据外部查询提取的值执行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驱动


Bra*_*y K 6

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

EX:

select ename, sal 
from emp  where sal > (select sal 
                       from emp where ename ='FORD');
Run Code Online (Sandbox Code Playgroud)

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

例如:

select empno,sal,deptid 
from emp e 
where sal=(select avg(sal) 
           from emp where deptid=e.deptid);
Run Code Online (Sandbox Code Playgroud)

区别

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

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

有关更多信息,请访问: http ://www.oraclegeneration.com/2014/01/sql-interview-questions.html