2015-05-11 4 views
0

Я думаю, что я нашел ошибку в SQL Server 2012. У меня есть следующий сложный запрос, который использует КТР с row_number для выполнения поискового вызова, а затем подзапрос вернуть общее число строк в одном запросе:Ошибка SQL Server 2012 CTE?

with data as (...complex query with row_number() ... as rowNumber...) 
select *, (select count(*) from data) as totalRows 
from data 
where rowNumber between 1 and 10 

Я «Я нашел в своем конкретном запросе, что если окончательный запрос возвращает 5 строк, totalRows возвращается как 8. Но есть только 5 строк. Как может totalRows быть больше, чем количество возвращенных строк? Я пробовал подсказки запросов, такие как отключение параллельных планов выполнения, но не только медленнее, но все равно не так. Могу ли я делать что-то неправильно или это ошибка? Есть ли другой способ вернуть счет в одном запросе?

+3

Вы не подаете свой фильтр 1 до 10 против выбора COUNT (*) из данных. Если вы сделаете это как временную таблицу вместо CTE, вы можете увидеть, как CTE действительно работает. Я бы не использовал RowNumber без раздела и над предложением –

ответ

1

Не зная внутренности вашего запроса и обеспечение вы секционирование заявление хорошо написано ...

Я хотел бы предложить, что вы получаете различия из-за ваш ИНЕК. Вы должны быть последовательными и использовать:

with data as (...complex query with row_number() ... as rowNumber...) 
select *, (select count(*) from data where rowNumber between 1 and 10) as totalRows 
from data 
    where rowNumber between 1 and 10 

или

with data as (...complex query with row_number() ... as rowNumber...) 
select *, (select count(*) from data) as totalRows 
from data 
+0

Спасибо, но это не подходит. Я запрашиваю одну страницу данных длиной 10 строк, но я также хочу вернуть счет всех строк, чтобы я мог настроить пейджер, показывающий, например, «строки 1-10 из 235». Мне не нужно было бы запрашивать этот счет, если бы мне просто нужны строки - я мог просто подсчитать их на стороне клиента. – powlette

+0

Я предположил, что ваше предложение where может быть для результатов поискового вызова, но если счетчик возвращает другое значение, чем возвращенные строки, вы должны попробовать свои ответы в запросах, которые я опубликовал, чтобы убедиться, что все стало последовательным. Затем, когда вы смотрите на возвращаемые данные, вы можете решить, где что-то не так в вашем «сложном запросе с row_number()». Я предполагаю, что у вас заканчиваются пробелы в rowNumbers. –

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