티스토리 뷰

 

SQL Server 2012 T-SQL New Feature – ANY, SOME, ALL

 

먼저 SOME, ALL, ANY를 비교해보도록 하겠습니다.

좀 헤깔리는 내용이며 ANY는 기존의 EXISTS와 동일하게 사용이 가능합니다. 주의 깊게 사용하지 않을 경우는 잘못된 결과가 나올 수 있습니다.

 

 

  SELECT [BusinessEntityID]

   FROM [HumanResources].[Employee]

   WHERE [BusinessEntityID] IN (1,2,3)

위 구문의 결과는 1,2,3 이 나타납니다.

 

자 그럼 IF 문으로 EXISTS를 처리해보도록 하겠습니다.

 

 

IF EXISTS  (

  SELECT [BusinessEntityID]

   FROM [HumanResources].[Employee]

   WHERE [BusinessEntityID] IN (1,2,3)

)

PRINT 'EXISTS  IF'

ELSE

PRINT 'EXISTS  ELSE'

 

값이 존재하므로 무조건 EXISTS  IF 값이 출력됩니다.

 

여기에서 내부 쿼리의 값을 있는지 없는지가 아닌 정확한 값으로 비교하려면 어떻게 해야 할까요?

1 이 있는지, 2보다 작은 값이 있는지, 2보다 큰 값이 있는지 등등을 처리한다면 쿼리 문이 좀 많이 달라져야 할 것입니다. 아니면 괄호 안의 내부 쿼리가 변경되어야 합니다.

 

ALL을 한번 사용해보도록 하겠습니다.

 

IF 2= ALL  (

  SELECT [BusinessEntityID]

   FROM [HumanResources].[Employee]

   WHERE [BusinessEntityID] IN (1,2,3)

)

PRINT 'ALL IF'

ELSE

PRINT 'ALL ELSE'

 

ALL ELSE 가 반환됩니다. 전부 만족하지 않기 때문이죠

 

IF 2<= ALL  (

  SELECT [BusinessEntityID]

   FROM [HumanResources].[Employee]

   WHERE [BusinessEntityID] IN (1,2,3)

)

PRINT 'ALL IF'

ELSE

PRINT 'ALL ELSE'

 

ALL  ELSE 가 반환됩니다. 마찬가지로 전부 만족하지 않기 때문입니다.

 

 

IF 0<= ALL  (

  SELECT [BusinessEntityID]

   FROM [HumanResources].[Employee]

   WHERE [BusinessEntityID] IN (1,2,3)

)

PRINT 'ALL IF'

ELSE

PRINT 'ALL  ELSE'

 

1,2,3 0 보다 크므로 전부 만족하여 ALL  IF 가 반환됩니다.

 

 

SOME 을 한번 사용해보도록 하겠습니다.

IF 2= SOME  (

  SELECT [BusinessEntityID]

   FROM [HumanResources].[Employee]

   WHERE [BusinessEntityID] IN (1,2,3)

)

PRINT 'SOME IF'

ELSE

PRINT 'SOME ELSE'

 

1,2,3 중에서 2 와 같은 것이 있으므로 만족하여 SOME  IF 가 반환됩니다.

 

IF 2<= SOME  (

  SELECT [BusinessEntityID]

   FROM [HumanResources].[Employee]

   WHERE [BusinessEntityID] IN (1,2,3)

)

PRINT 'SOME IF'

ELSE

PRINT 'SOME ELSE'

 

1,2,3 의 일부는 2 보다 크거나 같으므로 만족하여 SOME  IF 가 반환됩니다.

 

IF 3< SOME  (

  SELECT [BusinessEntityID]

   FROM [HumanResources].[Employee]

   WHERE [BusinessEntityID] IN (1,2,3)

)

PRINT 'SOME  IF'

ELSE

PRINT 'SOME  ELSE'

 

3 보다 큰 값이 없으므로 SOME  ELSE 가 반환됩니다.

 

 

ANY 을 한번 사용해보도록 하겠습니다. SOME과 동일하다는 것을 알 수 있습니다.

 

IF 2= ANY  (

  SELECT [BusinessEntityID]

   FROM [HumanResources].[Employee]

   WHERE [BusinessEntityID] IN (1,2,3)

)

PRINT 'ANY  IF'

ELSE

PRINT 'ANY  ELSE'

 

2 가 있으므로 ANY  IF 가 반환됩니다.

 

IF 2<= ANY  (

  SELECT [BusinessEntityID]

   FROM [HumanResources].[Employee]

   WHERE [BusinessEntityID] IN (1,2,3)

)

PRINT 'ANY  IF'

ELSE

PRINT 'ANY  ELSE'

 

2 보다 작은 값이 있으므로 ANY  IF 가 반환됩니다.

 

IF 3< ANY  (

  SELECT [BusinessEntityID]

   FROM [HumanResources].[Employee]

   WHERE [BusinessEntityID] IN (1,2,3)

)

PRINT 'ANY  IF'

ELSE

PRINT 'ANY  ELSE'

 

3 보다 크지 않으므로 ANY  ELSE 가 반환됩니다.

 

간략히 알아보았으며 이중 ANYSOME의 경우는 EXISTS와 실행 계획이 동일하게 동작됩니다.

쿼리 문을 변경하여 아래와 같은 쿼리를 실행해봅니다.

 

 

SELECT  FirstName, LastName

FROM [Person].[Person] p

WHERE EXISTS (

 SELECT [BusinessEntityID]

   FROM [HumanResources].[Employee] e

   WHERE [VacationHours]=99 AND p.BusinessEntityID=e.BusinessEntityID

)

 

결과는 아래와 같이 3 사람이 반환 됩니다.

 

/*

Ken     Sánchez

Betsy   Stadick

Chad   Niswonger

*/

 

위 쿼리에서 ANY, SOME를 사용해도 똑 같은 값이 나오며 실행계획을 비교해보면 똑같습니다.

 

SELECT  FirstName, LastName

FROM [Person].[Person] p

WHERE [BusinessEntityID] =ANY (

 SELECT [BusinessEntityID]

   FROM [HumanResources].[Employee] e

   WHERE [VacationHours]=99

)

 

 

ANY, SOME, ALL 등은 아래 내용을 참조할 수 있습니다.

http://msdn.microsoft.com/ko-kr/library/ms188336.aspx

http://msdn.microsoft.com/ko-kr/library/ms175064

 

댓글