Как сослаться на один CTE дважды?

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

with recs as (select *, row_number() over (order by id) as rownum from ......)
select * from recs where rownum between @a and @b .... select count(*) from recs

Очевидно, мой вопрос выше неоднороден, но это только для того, чтобы проиллюстрировать мой тезис. Я хочу страницу результатов И общее количество матчей. Как я делаю это, не имея необходимость буквально копировать и приклеивать все 20 + линия CTE?

25
задан marc_s 26 January 2010 в 06:08
поделиться

2 ответа

Вы можете использовать запятые для создания нескольких CTE, которые ссылаются на CTES выше.

Просто для иллюстрации того, что я имею в виду:

with recs as (
select 
    *, 
    row_number() over (order by id) as rownum from ......
    ),
counts as (
    select count(*) as totalrows from recs
)
select recs.*,count.totalrows
from recs
cross apply counts 
where rownum between @a and @b .... 

Это не является хорошим решением.

Лучшее решение, которое я обнаружил, имеет общий счет в CTE без подсчета записей, описан в в этой статье .

DECLARE @startRow INT; SET @startrow = 50;
WITH cols
AS
(
    SELECT table_name, column_name, 
        ROW_NUMBER() OVER(ORDER BY table_name, column_name) AS seq, 
        ROW_NUMBER() OVER(ORDER BY table_name DESC, column_name desc) AS totrows
    FROM [INFORMATION_SCHEMA].columns
)
SELECT table_name, column_name, totrows + seq -1 as TotRows
FROM cols
WHERE seq BETWEEN @startRow AND @startRow + 49
ORDERBY seq
19
ответ дан 28 November 2019 в 21:06
поделиться

Не думай, что вы можете. Из MSDN

общее выражение таблицы (CTE) может быть думал о временном наборе результатов это определено в выполнении Область применения одного выбора, вставка, Обновление, удаление или создание просмотра утверждение.

Упор на «Одиночный выбор, вставка, обновление, удаление или создание просмотра.»

Это может быть ситуация, когда вы хотите использовать временную таблицу .

CREATE TABLE #Recs
{
  .....
}
INSERT INTO #Recs
select *, row_number() over (order by id) as rownum from ......

Если вы не знаете структуру таблицы перед рукой, вы можете использовать эту форму, чтобы создать временную таблицу:

select *, row_number() over (order by id) as rownum INTO #Recs from ......

Вы сможете использовать временную таблицу таким образом, чтобы вы описали выше.

19
ответ дан 28 November 2019 в 21:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: