다음을 통해 공유


상관 하위 쿼리

대부분의 쿼리는 하위 쿼리를 한 번 실행하고 그 결과 값을 외부 쿼리의 WHERE 절에 대체함으로써 평가됩니다. 상관 하위 쿼리(반복 하위 쿼리라고도 함)가 포함된 쿼리에서 하위 쿼리는 외부 쿼리에 따라 값이 달라집니다. 즉, 하위 쿼리는 외부 쿼리에서 선택될 수 있는 각 행에 대해 한 번씩 반복적으로 실행됩니다.

다음 쿼리는 SalesPerson 테이블에서 보너스가 5000이고 Employee 및 SalesPerson 테이블에서 직원 ID 번호가 일치하는 각 직원의 이름 및 성의 인스턴스 하나를 검색합니다.

USE AdventureWorks;
GO
SELECT DISTINCT c.LastName, c.FirstName, e.EmployeeID 
FROM Person.Contact AS c JOIN HumanResources.Employee AS e
ON e.ContactID = c.ContactID 
WHERE 5000.00 IN
    (SELECT Bonus
     FROM Sales.SalesPerson sp
     WHERE e.EmployeeID = sp.SalesPersonID) ;
GO

결과 집합은 다음과 같습니다.

LastName FirstName EmployeeID

------------------------- ----------------- -----------

Ansman-Wolfe Pamela 280

Saraiva José 282

(2개 행 적용됨)

이 문의 이전 하위 쿼리는 외부 쿼리와 독립적으로 평가할 수 없습니다. 하위 쿼리에는 Employee.EmployeeID 값이 필요하지만 이 값은 SQL Server에서 Employee의 다른 행을 검사할 때마다 바뀝니다.

위의 쿼리는 다음과 같은 방법으로 평가됩니다. SQL Server는 내부 쿼리에 각 행의 값을 대체함으로써 결과에 포함될 Employee 테이블의 각 행을 평가합니다. 예를 들어 SQL Server에서 먼저 Syed Abbas에 대한 행을 검사하는 경우 Employee.EmployeeID 변수의 값이 288이 되며 SQL Server는 이 값을 내부 쿼리에 대체합니다.

USE AdventureWorks;
GO
SELECT Bonus
FROM Sales.SalesPerson
WHERE SalesPersonID = 288;

Syed Abbas는 영업 사원이 아니기 때문에 보너스를 받지 않으므로 결과 값은 0이 되어 외부 쿼리는 다음으로 평가됩니다.

USE AdventureWorks;
GO
SELECT LastName, FirstName
FROM Person.Contact c JOIN HumanResources.Employee e
ON e.ContactID = c.ContactID 
WHERE 5000 IN (0.00);

이 문의 결과는 false이므로 Syed Abbas의 행은 결과에 포함되지 않습니다. Pamela Ansman-Wolfe에 대한 행에 같은 프로시저를 실행합니다. 그러면 이 행이 결과에 포함됩니다.

상관 하위 쿼리는 외부 쿼리의 테이블에 있는 열을 테이블 반환 함수의 인수로 참조함으로써 FROM 절에 테이블 반환 함수를 포함할 수 있습니다. 이 경우 외부 쿼리의 각 행에 대해 테이블 반환 함수가 하위 쿼리에 따라 평가됩니다.