Tsql объединение подзапросов, каждый из которых требует предложения ORDER BY - PullRequest
16 голосов
/ 01 марта 2011

Привет, я прошу прощения, если ответ на этот вопрос находится где-то еще.Я оглянулся и не увидел простого решения.У меня есть запрос, который я хотел бы выполнить.Меня не волнует порядок набора объединений, только то, что внутренние запросы возвращают правильные данные, которые являются «Самыми большими областями».

(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 не позволит мне иметь ORDERBY на подзапросах, только на весь Союз ... Помощь оценена!Я действительно предпочел бы не создавать временные таблицы или что-то в этом роде.

Ответы [ 2 ]

29 голосов
/ 01 марта 2011

Попробуйте это

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
2 голосов
/ 01 марта 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...