티스토리 뷰
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 가 반환됩니다.
간략히 알아보았으며 이중 ANY와 SOME의 경우는 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
'SQL' 카테고리의 다른 글
SQL Server 2012 T-SQL New Feature – EOMONTH (0) | 2013.01.16 |
---|---|
SQL PASS Summit 2012 (0) | 2012.11.08 |
SQL Server 2012 코드 편집기 새 기능 (0) | 2012.05.23 |
SQL Server 2012 T-SQL New Feature – FIRST_VALUE, LAST_VALUE (0) | 2012.05.16 |
SQL Server 2012의 FileTable (0) | 2012.05.09 |
- Total
- Today
- Yesterday
- sharepoint
- sql server 2012
- Cloud
- hongju
- Paginated Report
- Power BI Desktop
- SharePoint 2013
- Power BI Desktop 업데이트
- 정홍주
- Windows Azure Mobile Services
- 업데이트
- Power BI 업데이트
- copilot
- Visual Studio 2010
- SharePoint 2010
- Windows Azure
- SQL Azure
- Power BI Update
- Microsoft Fabric
- 목표
- Power BI Desktop Update
- SharePoint Online
- Windows Phone 7
- Windows Azure 업데이트
- 페이지를 매긴 보고서
- SharePoint Object Model
- 클라우드
- Power BI Copilot
- Power BI
- redJu
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |