2013-09-19 4 views
1

SQL SERVER: Как я могу перечислить строки оператора select с помощью оператора union, но без перезапуска счетчика, без двуличности и без подзаголовка? Является ли это возможным? Мне нужно что-то с исполнением. Я получил его с подзапросом и функцией ROW_NUMBER(), но мне нужно что-то быстрее. Есть идеи? Благодаря!Нумерация строк оператора select с оператором union

+2

не ясно. Можете ли вы предоставить данные теста и ожидаемый результат. –

+0

Сколько времени занимает запрос? Каково ваше определение «достаточно быстро»? Проанализировали ли вы план запросов и обеспечили отсутствие индексов? –

ответ

2

Это самый быстрый, что я могу думать:

select t.*, row_number() over (order by (select NULL)) as seqnum 
from ((select * from A) union all 
     (select * from B) 
    ) t; 

Две вещи. Сначала это использует union all, а не union - поэтому дубликаты не удаляются. Это ускоряет запрос, если повторное удаление не требуется.

Во-вторых, он использует order by (select NULL)). По моему опыту, это, по-видимому, назначает последовательный номер на выходе, фактически не налагая накладные расходы на сортировку. Это строго основано на моем опыте. Я еще не нашел документацию по SQL Server, которая объясняет это. Но, я использовал его в прошлом успешно.

+1

WOW 'заказать (выбрать NULL)' - удивительно. – Hogan

+0

, так что на самом деле МОЖЕТ давать неправильные результаты? –

+0

GREAT! «Выберите NULL» в ORDER BY работает! Выбор почти сразу возвращается. Раньше это заняло около 4 секунд. Спасибо! – user2137198

1

Если вы используете SQL Server 2012+, вы можете попробовать это:

DECLARE @T TABLE (col1 INT, col2 INT); 

INSERT INTO @T 
VALUES (1, 2), (3, 4), (5, 6); 

SELECT COUNT(*) OVER (
     ORDER BY col1 ROWS UNBOUNDED PRECEDING 
     ) RN, col1, col2 
FROM @T 
+0

Почему использовать count, а не row_number? – Hogan

+0

Я голосую за «СУММУ (1) ЗА ЗАКАЗ ПО КОРОЛЬНЫМ РАВНЫМ НЕОБХОДИМЫМ ПРЕКРАЩЕНИЕМ)» :-) – dnoeth

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