Я пытаюсь подсчитать строки в select перед OFFSET FETCH. Но, насколько я знаю, нет способа получить общее количество строк запроса в select. Вот почему вам нужно скопировать весь Select, чтобы просто подсчитать строки раньше ...

1
Tie Kapch 15 Янв 2021 в 18:19

3 ответа

Лучший ответ

Вы также можете посмотреть глобальную переменную @@ROWCOUNT в SQL Server после выполнения исходного запроса, чтобы узнать, сколько строк возвращается:

SELECT @@ROWCOUNT 

Это также может быть полезно при запуске UPDATE / INSERT.

См. Microsoft Документы для получения дополнительной информации.

2
marc_s 15 Янв 2021 в 16:02

(1) если вам просто нужно увидеть, сколько записей было возвращено, вы можете запустить это как второй запрос:

SELECT @@ROWCOUNT

(2) если вам действительно нужно больше работать с данными, вы можете переместить основной фрагмент кода в представление.

CREATE VIEW YourView 
AS 
SELECT *
FROM Table1 
INNER JOIN Table2 ON Table2.Id = Table1.Table2Id
INNER JOIN Table3 ON Table3.Id = Table1.Table3Id
INNER JOIN Table4 on Table4.Id = Table1.Table4Id

И чем просто выбрать из него несколько раз:

select count (*) from YourView where WHERE [Table1].Amount >= @Count
select * from YourView where WHERE [Table1].Amount >= @Count

(3) или вы можете вставить в #tempTable или @tableVariable

SELECT * INTO #TempTable
FROM Table1 
INNER JOIN Table2 ON Table2.Id = Table1.Table2Id
INNER JOIN Table3 ON Table3.Id = Table1.Table3Id
INNER JOIN Table4 on Table4.Id = Table1.Table4Id
WHERE [Table1].Amount >= @Count

А затем выберите из них, например, из таблицы или просмотра:

select count(*) from #TempTable
select * from #TempTable

(4) Общее табличное выражение (предложение WITH), предложенное в другом ответе, опубликованном Алеком, на самом деле не будет работать для вашего сценария, поскольку вам нужны 2 отдельных результата, а CTE позволяет только один выбор для него.

Примечание: весь синтаксис предоставлен для tsql (MS Sql Server), вам может потребоваться настроить его для вашего сервера БД.

1
Сергей Чайкин 15 Янв 2021 в 16:08

Вы можете использовать предложение WITH.

WITH query_name AS (SELECT *
                 FROM Table1 
                 INNER JOIN Table2 ON Table2.Id = Table1.Table2Id
                 INNER JOIN Table3 ON Table3.Id = Table1.Table3Id
                 INNER JOIN Table4 on Table4.Id = Table1.Table4Id
                 WHERE [Table1].Amount >= @Count)

SELECT * FROM query_name;
SELECT count(*) FROM query_name;
-2
Alec 15 Янв 2021 в 15:32
65738720