Разница между подзапросом и коррелированным подзапросом

Является ли следующая часть 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

Кроме того, может ли кто-нибудь указать разницу между обоими


person Divakar    schedule 24.06.2013    source источник
comment
На самом деле это производная таблица. Кстати, вам не удалось скопировать / вставить закрывающую скобку и псевдоним для производной таблицы.   -  person Nikola Markovinović    schedule 24.06.2013


Ответы (7)


Коррелированный подзапрос - это подзапрос, который использует значения из внешнего запроса. В этом случае внутренний запрос должен выполняться для каждой строки внешнего запроса.

См. Пример здесь 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);
person Alex    schedule 24.06.2013
comment
Я слышал от своих коллег, что это коррелированный подзапрос. Но я не могу понять, как это сделать, поскольку внутренний запрос выполняется независимо. Итак, является ли мой запрос коррелированным подзапросом или обычным подзапросом? - person Divakar; 24.06.2013
comment
Там нет коррелированного подзапроса - person Alex; 24.06.2013
comment
Я не вижу коррелированного подзапроса в приведенном примере. - person Churk; 26.03.2014
comment
Это простой подзапрос, представленный в примере, коррелированный подзапрос, который вы можете найти по вики-ссылке. Пожалуйста, простите мой ответ за то, что я немного запутался - person Alex; 22.12.2014
comment
В этом случае внутренний запрос должен выполняться для каждой строки внешнего запроса - обратите внимание, что именно так он выполняется логически. Большинство современных оптимизаторов, вероятно, перепишут связанный подзапрос в соединение, если это возможно (и, таким образом, избегая дорогостоящего построчного выполнения подзапроса). - person a_horse_with_no_name; 07.02.2016
comment
Множество современных малоэффективных запросов с использованием коррелированных подзапросов можно улучшить путем ручной замены коррелированных подзапросов. Кроме того, что произойдет, если оптимизатора нет в этом списке? - person Paul Maxwell; 07.02.2016
comment
@a_horse_with_no_name Большинство современных оптимизаторов, вероятно, перепишут связанный подзапрос в соединение, если это возможно, это довольно расплывчатое обобщение, я бы не полагался на предположение, что оптимизатор исправит плохой код. Коррелированные подзапросы - это RBAR, циклы, в которых выполняется Row-By-Agonizing-Row, и их следует избегать в пользовательском коде. sqlservercentral.com/articles/Stairway+Series/105972 потребности коррелированного подзапроса для выполнения для каждой строки-кандидата во внешнем запросе. - person Davos; 22.03.2017

Вышеупомянутый пример не является подзапросом, связанным с совместным использованием. Это производная таблица / встроенное представление, т. Е. Подзапрос в предложении FROM.

Подзапрос Corelated должен ссылаться на свою родительскую (основную) таблицу в нем. Например, посмотрите, как найти N-ю максимальную зарплату по сопутствующему подзапросу:

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

Сопутствующие и вложенные подзапросы.

Техническая разница между обычным подзапросом и сопутствующим подзапросом:

1. Цикл: Цикл подзапроса, связанный с основным запросом; тогда как вложенных нет; поэтому связанный подзапрос выполняется на каждой итерации основного запроса. Тогда как в случае вложенного запроса; сначала выполняется подзапрос, затем выполняется внешний запрос. Следовательно, максимума нет. выполнений - это NXM для коррелированного подзапроса и N + M для подзапроса.

2. Зависимость (от внутреннего к внешнему и от внешнего к внутреннему): В случае связанного подзапроса внутренний запрос зависит от внешнего запроса для обработки, тогда как в обычном подзапросе внешний запрос зависит от внутреннего запроса.

3.Производительность: использование связанных подзапросов снижает производительность, так как он выполняет итерации NXM вместо N + M итераций. ¨ Выполнение связанных подзапросов.

Для получения дополнительной информации с примерами:

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

person nayeemDotNetAuthorities    schedule 10.01.2014
comment
@nayeemDotNetAutorities Вышеупомянутый пример не связан с подзапросом, связанным с сопутствующим взаимодействием? что здесь вверху? Если это связано с другим ответом, пожалуйста, воздержитесь от использования таких относительных терминов при ответе на другой ответ. Потому что то, что может быть выше сейчас, может быть изменено позже. - person KNU; 27.03.2015
comment
приведенный выше пример = запрос OP ... обычно ответы относятся к вопросу, иногда к другим ответам, но со ссылкой на того, кто владеет этим ответом ... - person Felypp Oliveira; 16.01.2018
comment
Что такое NXM? ›››› - person Robert Rocha; 10.04.2018

Подзапрос - это оператор выбора, который встроен в предложение другого оператора выбора.

EX:

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

Коррелированный подзапрос - это подзапрос, который оценивается один раз для каждой строки, обрабатываемой внешним запросом или основным запросом. Выполните внутренний запрос на основе значения, полученного внешним запросом, все значения, возвращенные основным запросом, совпадают. ВНУТРЕННИЙ запрос управляется ВНЕШНИМ запросом.

Ex:

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

person Brahmareddy K    schedule 29.12.2015

СООТВЕТСТВУЮЩИЕ ПОДПРОСЫ: оценивается для каждой строки, обрабатываемой основным запросом. Выполните внутренний запрос на основе значения, полученного внешним запросом. Продолжается до тех пор, пока не будут сопоставлены все значения, возвращаемые основным запросом. ВНУТРЕННИЙ запрос управляется ВНЕШНИМ запросом

Ex:

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

Подзапрос Correlated специально вычисляет AVG(sal) для каждого отдела.

SUBQUERY: запускается первым, выполняется один раз, возвращает значения, которые будут использоваться в MAIN Query. ВНЕШНИЙ запрос управляется ВНУТРЕННИМ ЗАПРОСОМ

person Kumaran    schedule 17.07.2014

когда дело доходит до подзапроса и связанного запроса, оба имеют внутренний запрос и внешний запрос, единственная разница заключается в подзапросе, внутренний запрос не зависит от внешнего запроса, тогда как в связанном внутреннем запросе зависит от внешнего.

person Prashanth S R    schedule 17.11.2014

Я думаю, что приведенное ниже объяснение поможет вам ... различие между ними: Correlated subquery - это внутренний запрос, на который ссылается основной запрос (внешний запрос), так что внутренний запрос рассматривается как многократно выполняемый.

non-correlated subquery - это подзапрос, который не зависит от внешнего запроса и может выполняться сам по себе, не полагаясь на основной внешний запрос.

plain subquery не зависит от внешнего запроса,

person rcmuthu786    schedule 24.06.2013
comment
Я слышал от своих коллег, что это коррелированный подзапрос. Но я не могу понять, как это сделать, поскольку внутренний запрос выполняется независимо. Итак, является ли мой запрос коррелированным подзапросом или обычным подзапросом? - person Divakar; 24.06.2013

В запросе SQL, если внутренний запрос выполняется для каждой строки внешнего запроса. Если внутренний запрос выполняется один раз, а результат используется внешним запросом, то он вызывается как несвязанный запрос.

Коррелированные подзапросы обычно соответствуют нормальным запросы соединения, т. е. запросы соединения, которые не имеют подзапросов и обычно могут быть выражены как таковые. Иногда рекомендуется транслировать их в такие запросы соединения, потому что большинство СУБД SQL будет их выполнять .....

person Saravanakumar Kandasamy    schedule 21.03.2018