子查询和相关子查询的区别
Posted
技术标签:
【中文标题】子查询和相关子查询的区别【英文标题】:Difference between Subquery and Correlated Subquery 【发布时间】:2013-06-20 13:38:53 【问题描述】:以下 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
还有,谁能说出两者的区别
【问题讨论】:
这实际上是一个derived table。顺便说一句,您未能复制/粘贴右括号和派生表的别名。 【参考方案1】:上面的例子不是 Co-related Sub-Query。它是派生表/内联视图,即 FROM 子句中的子查询。
一个相关的子查询应该引用它的父(主查询)表。例如通过 Co-related Sub-query 查找第 N 个最高薪水:
SELECT Salary
FROM Employee E1
WHERE N-1 = (SELECT COUNT(*)
FROM Employee E2
WHERE E1.salary <E2.Salary)
共同相关与嵌套子查询。
Normal Sub-query 和 Co-related sub-query 的技术区别是:
1.循环: main-query下的关联子查询循环;而不是嵌套的;因此,相关的子查询在主查询的每次迭代中执行。而在嵌套查询的情况下;子查询首先执行,然后外部查询接下来执行。因此,最大数量。相关子查询的执行次数为 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
【讨论】:
@nayeemDotNetAutorities “上面的例子不是共同相关的子查询”?上面是什么?如果它与其他答案有关,请不要在回答另一个答案时使用此类相对术语。因为现在可能上面的内容可能会在以后改变。 以上示例 = OP 的查询...通常,答案指的是问题,有时指的是其他答案,但指的是拥有该答案的人... 什么是NXM?>>>>【参考方案2】:相关子查询是使用来自外部查询的值的子查询。在这种情况下,必须为外部查询的每一行执行内部查询。
在此处查看示例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');
相关子查询示例 -
查询以查找其部门工资高于平均水平的所有员工
SELECT employee_number, name
FROM employees emp
WHERE salary > (
SELECT AVG(salary)
FROM employees
WHERE department = emp.department);
【讨论】:
听同事说是关联子查询。但我无法理解如何,因为内部查询是独立运行的。那么,我的查询是相关子查询还是普通子查询? 那里没有相关的子查询 我在提供的示例中没有看到相关的子查询。 这是一个简单的子查询,在示例中提供,您可以在 wiki-link 之后找到相关的子查询。请原谅我的回答有点乱 "在这种情况下,必须为外部查询的每一行执行内部查询" - 请注意,这是逻辑上执行的方式.如果可能,大多数现代优化器可能会将相关的子查询重写为连接(从而避免昂贵的逐行执行子查询)【参考方案3】:子查询是嵌入在另一个 select 语句的子句中的 select 语句。
前:
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
【讨论】:
【参考方案4】:相关子查询:针对主查询处理的每一行进行评估。根据外部查询获取的值执行内部查询。继续直到主查询返回的所有值都匹配。 INNER Query 由 OUTER Query 驱动
例如:
SELECT empno,fname,sal,deptid FROM emp e WHERE sal=(SELECT AVG(sal) FROM emp WHERE deptid=e.deptid)
Correlated 子查询专门为每个部门计算 AVG(sal)
。
SUBQUERY:首先运行,执行一次,返回主查询使用的值。外部查询由内部查询驱动
【讨论】:
【参考方案5】:子查询和关联查询都有内部查询和外部查询,唯一的区别是子查询内部查询不依赖外部查询,而关联内部查询依赖外部查询。
【讨论】:
【参考方案6】:我认为下面的解释会对你有所帮助..
它们之间的区别:
Correlated subquery
是主查询(外查询)引用的内查询,因此内查询被视为重复执行。
non-correlated subquery
是一个独立于外部查询的子查询,它可以独立执行而不依赖于主外部查询。
plain subquery
不依赖外层查询,
【讨论】:
听同事说是关联子查询。但我无法理解如何,因为内部查询是独立运行的。那么,我的查询是相关子查询还是普通子查询?【参考方案7】:在 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 .....
【讨论】:
以上是关于子查询和相关子查询的区别的主要内容,如果未能解决你的问题,请参考以下文章