Самый эффективный способ ограничить возврат строк из запроса на объединение - TSQL - PullRequest
4 голосов
/ 23 декабря 2010

Эй, ребята ... У меня есть простой сохраненный процесс с двумя запросами, объединенными с объединением

select name as 'result'
from product
where...

union

select productNum as 'result'
from product
where...

Я хочу ограничить это ТОП 10 результатами ...

если я поставлю TOP 10 в каждом отдельном запросе, я получу всего 20 результатов.

Какой самый эффективный способ ограничить общее количество результатов до 10? Я не хочу делать ТОП 5 в каждом, потому что я могу оказаться в ситуации, когда у меня есть что-то вроде 7 "имён" и 3 "номеров продуктов"

Ответы [ 5 ]

12 голосов
/ 23 декабря 2010
WITH Results (Result)
AS
(

select name as 'result'
from product
where...

union

select productNum as 'result'
from product
where...
)

SELECT TOP 10 * FROM Results

Общее табличное выражение

5 голосов
/ 23 декабря 2010
select top 10 * from
(
select top 10 ....
from ....
where ....

union

select top 10 ....
from ....
where ....
) x

является основной идеей. Добавление первых 10 к каждому объединению означает, что у вас будет меньший набор для ограничения во внешнем запросе.

Если вы хотите расставить приоритеты (т.е. вернуть как можно больше из первого результата), тогда вы можете сделать это:

select top 10 * from
(
select top 10 
1 as prio_col, ....
from ....
where ....

union

select top 10 
2 as prio_col....
from ....
where ....
) x
order by prio_col

чтобы вы могли получить как можно больше из первого набора и использовать результаты из второго набора только как «запасной вариант».

3 голосов
/ 23 декабря 2010

Используйте вершину для каждого подмножества и в конце используйте его для результата объединения.

select top 10 * from (
select top 10 name as 'result'
from product
where...

union

select top 10 productNum as 'result'
from product
where...
)
0 голосов
/ 23 декабря 2010

Самый простой вариант - просто установить количество строк в 10

Set RowCount 10
select name as 'result'
from product
where...

union

select productNum as 'result'
from product
where...
0 голосов
/ 23 декабря 2010

Вы можете просто обернуть это с помощью Подзапроса или Общего выражения таблицы , например:

;with cte as 
(select name as 'result'
from product
where...

union

select productNum as 'result'
from product
where...) 
select top 10 * from cte;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...