Найти количество записей производной таблицы в SQL Server - PullRequest
6 голосов
/ 18 июня 2019
CREATE  TABLE   Temp
(
   ID   Int IDENTITY,
   Name Varchar(100)
)

INSERT  INTO    Temp
SELECT  'Elby'
UNION ALL
SELECT  'Eljo'
UNION ALL
SELECT  'Elsy'
UNION ALL
SELECT  'Elsy'
UNION ALL
SELECT  'Eljo'
UNION ALL
SELECT  'Elsy'
UNION ALL
SELECT  'Elsy'

Мой требуемый результат - ..

    ----------------------------------------
    TotalRecordCount        ID      Name
    ----------------------------------------
    7                       5       Elby
    7                       6       Eljo
    7                       7       Elsy
    7                       8       Elsy
    ----------------------------------------    

Мой запрос ...

SELECT  TotalRecordCount,
        ID,
        Name        
FROM    (
        SELECT  *
        FROM    Temp
      ) Tab1
WHERE   ID > 4

У меня вопрос, как мне найти значение для поля «TotalRecordCount». Это общее количество таблицы «Temp».

Я не могу использовать запрос типа 'SELECT COUNT(*) FROM Temp AS TotalRecordCount', потому что это не одна таблица.

Это как (SELECT * FROM Table1 JOIN TABLE2 ON (Table1.ID = Table2.ID) JOIN TABLE3 ON (TABLE2.ID = TABLE3.ID) JOIN TABLE4 ON (TABLE3.ID = TABLE4.ID).....)

Для вашего понимания я использовал 'temp' вместо всего запроса.

Ответы [ 3 ]

5 голосов
/ 18 июня 2019

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

WITH Counts AS(
    SELECT ID,
           [Name],
           COUNT(*) OVER () AS TotalRows
    FROM dbo.Temp)
SELECT TotalRows,
       ID,
       [Name]
FROM Counts
WHERE ID > 4;
2 голосов
/ 18 июня 2019

Для развлечения вы можете сделать это без подзапросов или CTE:

select top (1) with ties t.*, count(*) over () as cnt
from temp t
order by (case when id > 4 then 1 else 2 end)
1 голос
/ 18 июня 2019

Таким образом, «Temp» в вашем примере является заполнителем для какого-то большого сложного запроса, который вы не хотите повторять. Общее табличное выражение хорошо для такого рода вещей:

WITH cteTemp AS (
    SELECT *
    FROM Temp
)
SELECT (SELECT COUNT(*) FROM cteTemp) AS TotalRecordCount,
      ID,
      Name
FROM cteTemp
WHERE ID > 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...