【问题标题】:Find the record count of the derived table in SQL Server在 SQL Server 中查找派生表的记录数
【发布时间】:2019-06-18 18:47:13
【问题描述】:
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”而不是整个查询。

【问题讨论】:

  • 所以您想要一个与实际结果不同的总记录数?计算计数 Vs 时要小心。当你过滤时。

标签: sql sql-server


【解决方案1】:

您可以使用 CTE 和窗口函数来执行此操作,以避免对表进行第二次扫描:

WITH Counts AS(
    SELECT ID,
           [Name],
           COUNT(*) OVER () AS TotalRows
    FROM dbo.Temp)
SELECT TotalRows,
       ID,
       [Name]
FROM Counts
WHERE ID > 4;

【讨论】:

  • 我可以从这个单一的查询中得到一个变量的总数吗?
  • 是的,就像处理任何其他查询一样,@ElbyJoy,SELECT @{Variable Name} = {Column Name} FROM CTE...
  • 我只需要变量中的行数。
  • 我这样重写查询。
【解决方案2】:

为了好玩,您可以在没有子查询或 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)

【讨论】:

    【解决方案3】:

    因此,您示例中的“Temp”是您不想重复的一些大型复杂查询的占位符。公用表表达式适用于这类事情:

    WITH cteTemp AS (
        SELECT *
        FROM Temp
    )
    SELECT (SELECT COUNT(*) FROM cteTemp) AS TotalRecordCount,
          ID,
          Name
    FROM cteTemp
    WHERE ID > 4
    

    【讨论】:

    • 它会是,如果这并不意味着 cte 将被执行两次。拉努的回答是一个更好的选择。您可以在本地服务器上运行this script 并检查执行计划。
    • 是的,你是对的。我太相信优化器了:)
    猜你喜欢
    • 1970-01-01
    • 2016-01-09
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多