47

以下 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

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

4

8 回答 8

85

上面的例子不是 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) 

相关与嵌套子查询。

普通子查询和关联子查询的技术区别是:

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

2. 依赖(Inner to Outer vs Outer to Inner): 在关联子查询的情况下,内部查询依赖于外部查询进行处理,而在普通子查询中,外部查询依赖于内部查询。

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

有关示例的更多信息:

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

于 2014-01-10T05:31:19.987 回答
58

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

请参阅此处的示例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);
于 2013-06-24T06:41:26.407 回答
8

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

前任:

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

相关子查询是对外部查询或主查询处理的每一行评估一次的子查询。根据外部查询获取的值执行内部查询,主查询返回的所有值都匹配。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

于 2015-12-29T19:24:10.630 回答
7

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

前任:

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

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

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

于 2014-07-17T08:35:54.350 回答
2

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

于 2014-11-17T04:22:20.700 回答
1

我认为下面的解释将对您有所帮助.. 区分: Correlated subquery是主查询(外部查询)引用的内部查询,因此内部查询被视为重复执行。

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

plain subquery不依赖于外部查询,

于 2013-06-24T06:51:34.920 回答
0

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

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

于 2018-03-21T13:59:45.010 回答
0

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

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

  1. where deptid=e.deptid注意e.哪个是主要查询
  2. WHERE department = emp.department注意emp.哪个是主要查询
  3. WHERE E1.salary <E2.Salary这个标签既E1.作为主查询又E2.作为相关子查询。

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

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

于 2022-02-23T13:11:10.453 回答