【问题标题】: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。顺便说一句,您未能复制/粘贴右括号和派生表的别名。

标签: sql sql-server subquery correlated-subquery


【解决方案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】:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-24
          • 2015-07-16
          • 2014-09-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多