다음을 통해 공유


IN을 사용한 하위 쿼리

IN 또는 NOT IN으로 시작하는 하위 쿼리의 결과는 값이 0 이상인 목록입니다. 하위 쿼리에서 결과를 반환하면 외부 쿼리에서 이 값을 사용합니다.

다음 쿼리는 Adventure Works Cycles에서 만드는 모든 자전거 바퀴 제품의 이름을 검색합니다.

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN
    (SELECT ProductSubcategoryID
     FROM Production.ProductSubcategory
     WHERE Name = 'Wheels');

결과는 다음과 같습니다.

Name

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

LL Mountain Front Wheel

ML Mountain Front Wheel

HL Mountain Front Wheel

LL Road Front Wheel

ML Road Front Wheel

HL Road Front Wheel

Touring Front Wheel

LL Mountain Rear Wheel

ML Mountain Rear Wheel

HL Mountain Rear Wheel

LL Road Rear Wheel

ML Road Rear Wheel

HL Road Rear Wheel

Touring Rear Wheel

(14 row(s) affected)

이 문은 두 단계로 나누어서 계산됩니다. 먼저 내부 쿼리는 이름이 'Wheel'(17)인 하위 범주 ID를 반환합니다. 두 번째는 이 값이 Product에서 하위 범주의 ID에 해당하는 제품 이름을 검색하는 외부 쿼리로 대체됩니다.

USE AdventureWorks2008R2;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN ('17');

이 경우 하위 쿼리 대신 조인을 사용하면 결과에 둘 이상의 테이블에 포함된 열을 보여 줄 수 있다는 점이 다릅니다. 예를 들어 결과에 제품 하위 범주의 이름을 포함하려면 조인 버전을 사용해야 합니다.

Use AdventureWorks2008R2;
GO
SELECT p.Name, s.Name
FROM Production.Product p
INNER JOIN Production.ProductSubcategory s
ON p.ProductSubcategoryID = s.ProductSubcategoryID
AND s.Name = 'Wheels';

결과는 다음과 같습니다.

Name Name

LL Mountain Front Wheel Wheels

ML Mountain Front Wheel Wheels

HL Mountain Front Wheel Wheels

LL Road Front Wheel Wheels

ML Road Front Wheel Wheels

HL Road Front Wheel Wheels

Touring Front Wheel Wheels

LL Mountain Rear Wheel Wheels

ML Mountain Rear Wheel Wheels

HL Mountain Rear Wheel Wheels

LL Road Rear Wheel Wheels

ML Road Rear Wheel Wheels

HL Road Rear Wheel Wheels

Touring Rear Wheel Wheels

(14 row(s) affected)

다음 쿼리는 20개 이상의 Adventure Works Cycles 항목을 주문하고 평균 배달 리드 타임이 16일 미만으로 신용도가 좋은 모든 공급업체의 이름을 검색합니다.

Use AdventureWorks2008R2;
GO
SELECT Name
FROM Purchasing.Vendor
WHERE CreditRating = 1
AND BusinessEntityID IN
    (SELECT BusinessEntityID
     FROM Purchasing.ProductVendor
     WHERE MinOrderQty >= 20
     AND AverageLeadTime < 16);

결과는 다음과 같습니다.

Name

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

Compete Enterprises, Inc

International Trek Center

First National Sport Co.

Comfort Road Bicycles

Circuit Cycles

First Rate Bicycles

Jeff's Sporting Goods

Competition Bike Training Systems

Electronic Bike Repair & Supplies

Crowley Sport

Expert Bike Co

Team Athletic Co.

Compete, Inc.

(13 row(s) affected)

내부 쿼리를 계산하여 하위 쿼리 조건을 만족하는 공급업체의 ID를 반환한 후 외부 쿼리를 계산합니다. 내부 쿼리 및 외부 쿼리 모두에 있는 WHERE 절에 둘 이상의 조건을 포함할 수 있습니다.

조인을 사용하면 동일한 쿼리를 다음과 같이 표시할 수 있습니다.

USE AdventureWorks2008R2;
GO
SELECT DISTINCT Name
FROM Purchasing.Vendor v
INNER JOIN Purchasing.ProductVendor p
ON v.BusinessEntityID = p.BusinessEntityID
WHERE CreditRating = 1
AND MinOrderQty >= 20
AND AverageLeadTime < 16;

조인은 항상 하위 쿼리로 표시할 수 있지만 하위 쿼리를 항상 조인으로 표시할 수는 없습니다. 그 이유는 조인이 대칭적이기 때문입니다. 즉, 어떤 순서로 테이블 A를 테이블 B에 조인해도 같은 결과를 얻습니다. 그러나 하위 쿼리가 있는 경우는 이에 해당되지 않습니다.

참고 항목

개념