2013-05-02 5 views
8

Каков наилучший способ ВЫБРАТЬ TOP N записей из UNION из 2 запросов?SELECT TOP ... FROM UNION

Я не могу сделать

SELECT TOP N ... FROM 
    (SELECT ... FROM Table1 
    UNION 
    SELECT ... FROM Table2) 

, поскольку оба запроса возвращают огромные результаты, которые необходимы каждый бит оптимизации возможно и хотели бы, чтобы избежать возвращения все. По той же причине я не могу сначала вставлять результаты в таблицу #TEMP.

Я не могу использовать SET ROWCOUNT N либо потому, что мне может понадобиться группировать результаты, и эта команда ограничит количество сгруппированных строк, а не выбор основных строк.

Любые другие идеи? Благодаря!

+2

Я бы «TOP» также подзаголовки. – acdcjunior

+0

Почему 'UNION'? Вы хотите удалить повторяющиеся строки? –

+1

Почему вы не можете сделать это с помощью 'UNION ALL'? Я тестировал выше запрос в таблице с> 100000000 записей, и результат пришел немедленно. –

ответ

12

Используйте Top ключевое слово для внутренних запросов также:

SELECT TOP N ... FROM 
(SELECT TOP N... FROM Table1 
UNION 
SELECT TOP N... FROM Table2) 
+1

На самом деле это, я думаю, именно то, что мне нужно. (см. мои комментарии выше) Если, например, я запросил SELECT TOP 10, а первый запрос содержит 20 записей, он также будет ограничен ТОП-10, поэтому будут включены только его результаты. Если он имеет, скажем, всего 3 записи, он произведет только 3 результата. Второй запрос даст еще 10 результатов, что даст всего 13, но внешний уровень TOP 10 ограничит его 10 - 3 от 1-го и 7-го от второго. Извините, задумываясь вслух :) Спасибо @ Deepak.Aggrawal –

+4

Microsoft SQL Server требует псевдонима (например, UNIONRESULT) для набора результатов, в противном случае он дает синтаксическую ошибку. – Edward

1

Вы можете попробовать следующее. Он использует CTE, который сначала даст вам результаты обоих запросов, а затем вы выберете TOP TOP из CTE.

WITH table_cte (
(
    [col1], 
    [col2], 
    ... 
) 
AS 
(
    SELECT * 
    FROM table1 
    UNION ALL 
    SELECT * 
    FROM table2 
) 

SELECT TOP 1000 * FROM table_cte 
+0

Спасибо, но производительность разумна, это похоже на подзапросы - внутренние запросы возвращают все базовые результаты, что не является оптимальным –

Смежные вопросы