2011-03-01 2 views
16

안녕하세요, 답변이 다른 경우 사과드립니다. 나는 주변을 둘러 보았고 간단한 해결책을 볼 수 없었다. 내가 실행하고 싶은 쿼리가 있습니다. 나는 내부 집합이 "가장 큰 영역"인 올바른 데이터를 반환한다는 것만으로 집합의 순서는 신경 쓰지 않습니다.Tsql 각각 ORDER BY 절을 필요로하는 하위 쿼리 조합

(SELECT TOP 5 * FROM [geo].[Areas] WHERE CountryID = @CountryID AND (TypeID = 'City') 
ORDER BY [ShapeArea] DESC) as BiggestCities 
    UNION ALL 
(SELECT TOP 5 * FROM [geo].[Areas] WHERE CountryID = @CountryID AND (TypeID = 'National park') 
ORDER BY [ShapeArea] DESC) as BiggestParks 

그러나 T-SQL 나를 하위 쿼리에 ORDER BY를 못하게는 단지 전체 연합 (EU)에 ... 감사 도와주세요! 임시 테이블이나 그런 것을 만들 필요가 없다.

답변

28

SELECT * 
    FROM (SELECT TOP 5 * 
      FROM [geo].[Areas] 
     WHERE CountryID = @CountryID 
      AND (TypeID = 'City') 
     ORDER BY [ShapeArea] DESC) as BiggestCities 
UNION ALL 
SELECT * 
    FROM (SELECT TOP 5 * 
      FROM [geo].[Areas] 
     WHERE CountryID = @CountryID 
      AND (TypeID = 'National park') 
     ORDER BY [ShapeArea] DESC) as BiggestParks 
+3

환상적인보십시오! 내가 필요한 것. Muchas Gracias :) –

+0

de nada, 빠르고 더러운 것입니다. 다른 누군가가 좀 더 우아 해졌고, 시도 할 시간이 없었습니다. @Joe Stefanelli의 –

+0

@PaulMcCowat SQLiteQueryBuilder로이 쿼리를 작성하는 방법을 말해 줄 수 있습니까? buildUnionSubQuery 메서드 및 buildUnionQuery 메서드 및 콘텐츠 공급자? –

2
SELECT t.* /* Excluding RowNum */ 
    FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY TypeID ORDER BY [ShapeArea] DESC) as RowNum 
      FROM [geo].[Areas] 
      WHERE CountryID = @CountryID 
      AND TypeID IN ('City', 'National park') 
     ) t 
    WHERE t.RowNum <= 5 
+0

SELECT *가 "new"열 RowNum을 반환 할 것이기 때문에 이전에 "SELECT * advice"를 피하는 것이 었습니다. –

+0

@ 필립 : 'SELECT *'를 피하는 데 절대적으로 동의하지만, 열 이름을 모른 채 여기에서 할 수있는 최선의 방법입니다. 또한'SELECT'가'RowNum' 열을 제외해야한다는 설명을 포함 시켰습니다. –

+0

이것은입니다. 나는 이미 알고 있었지만, 어쨌든 (폴과 폴의 대답 모두) 테스트를 거쳤으며, 전반적인 계획이 더 느릴 것이라고 확신합니다. – RichardTheKiwi