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

下面这段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

另外,谁能说说这两者之间的区别?

上面的例子不是共同相关的子查询。它是衍生表/内部视图,因为它是FROM条款中的一个子查询。

一个Corelated Sub-query应该引用它的父(主查询)表。例如:通过联合相关子查询找到第N个最高工资。


SELECT Salary 
FROM Employee E1
WHERE N-1 = (SELECT COUNT(*)
             FROM Employee E2
             WHERE E1.salary 
评论(4)
解决办法

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

请看这里的例子 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);
评论(7)

我想下面的解释会对你有所帮助。 这两者之间的区别。 相关子查询 "是指被主查询(外部查询)引用的内部查询,这样内部查询被认为是被重复删除的。

非相关子查询 "是一个独立于外部查询的子查询,它可以自己执行而不依赖主要的外部查询。

普通子查询 "不依赖于外部查询。

评论(1)