繁体   English   中英

子查询和关联子查询的区别

[英]Difference between Subquery and Correlated Subquery

下面这段SQL Query是普通查询还是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

另外,有人可以 state 两者之间的区别

上面的例子不是 Co-related Sub-Query。 它是派生表/内联视图,因为它是 FROM 子句中的子查询。

相关子查询应该在其中引用其父(主查询)表。 例如参见通过相关子查询查找第 N 个最高工资:

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

相关与嵌套子查询。

普通子查询和相关子查询之间的技术区别是:

1. Looping:主查询下的关联子查询循环; 而嵌套不; 因此,相关子查询在主查询的每次迭代中执行。 而在嵌套查询的情况下; 子查询先执行,然后外查询再执行。 因此,最大没有。 执行次数是关联子查询的 NXM 和子查询的 N+M。

2. 依赖(内到外 vs 外到内):在关联子查询的情况下,内查询依赖于外查询进行处理,而在正常子查询中,外查询依赖于内查询。

3.性能:使用 Co-related 子查询性能下降,因为它执行 NXM 迭代而不是 N+M 迭代。 ¨ 相关子查询执行。

有关示例的更多信息:

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

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

请参阅此处的示例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);

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

前任:

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

相关子查询是对外部查询或主查询处理的每一行评估一次的子查询。 根据外部查询获取的值执行内部查询,主查询返回的所有值都匹配。 INNER Query 由 OUTER Query 驱动。

前任:

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

CORRELATED SUBQUERIES:对主查询处理的每一行进行评估。 根据外部查询获取的值执行内部查询。 一直持续到主查询返回的所有值都匹配为止。 INNER Query 由 OUTER Query 驱动

前任:

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

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

SUBQUERY:首先运行,执行一次,返回由 MAIN Query 使用的值。 外部查询由内部查询驱动

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

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

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

plain subquery不依赖于外部查询,

在 SQL 查询中,如果内部查询对外部查询的每一行都执行。 如果内部查询执行一次,结果被外部查询消费,则称为非相关查询。

相关的子查询通常对应于普通的连接查询,即没有子查询的连接查询,并且通常可以这样表达。 有时建议将它们翻译成这样的连接查询,因为大多数 SQL DBMS 都会执行它们......

作为一名 SQL 的学生,帮助我理解subquerycorrelated subquery的区别的是,通常在WHERE子句中都有对这两个查询的引用。

例如,在查看这篇文章中的所有其他解决方案时,您可能会注意到一个趋势:

  1. where deptid=e.deptid注意e. 这是主要查询
  2. WHERE department = emp.department通知emp. 这是主要查询
  3. WHERE E1.salary <E2.Salary这一个标记为E1. 作为主要查询和E2. 作为相关子查询。

我没有在问题的WHERE子句中看到对主查询子查询的引用,所以不,我会说这不是相关子查询

感谢这篇文章中的每一个人!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM