【问题标题】:TSQL -- quick way to get a count across all tablesSQL——快速计算所有表的方法
【发布时间】:2019-06-25 00:17:12
【问题描述】:

如果数据库d1 的表T1,T2,T3,T4 都带有"Date1" 字段。

获取所有表中日期早于 3 天的所有记录的最佳方法是什么?

我知道可以做联合,我认为没有漂亮的语法可以省略所有表 [就像 C++ 中的“父”对象]。

这里最好可能意味着更高效,或者只是 T-SQL 中令人愉悦的语法。

这适用于 SSMS 17.7。微软 SQL Server 2014 (SP2)

【问题讨论】:

  • 使用适当的软件(MySQL、Oracle、DB2...)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。请注意,tsql 缩小了选择范围,但没有指定数据库。
  • 根据请求,更新为 17.7 -- 这是我产品的“帮助-->关于”。多年来,微软在其所有产品上都使用了该功能,但现在某些 Microsoft 产品已缺少此功能!
  • SQL Server Management Studio (SSMS) 不是数据库,但它可以连接到一个(或多个)。如果您使用的是 SQL Server,您可以使用 select @@Version; 获取数据库软件的版本。

标签: tsql count sql-server-2014 ssms-17


【解决方案1】:

如果你事先知道表名,一个简单的 union all 查询可能是最简单的方法:

SELECT COUNT(*)
FROM
(
     SELECT Date1
     FROM T1
     UNION ALL
     SELECT Date1
     FROM T2
     SELECT Date1
     FROM T3
     SELECT Date1
     FROM T4
) As t
WHERE Date1 <= DATEADD(DAY, -3, GETDATE())

如果事先不知道表名,可以使用information_schema.columns动态构建联合查询。

【讨论】:

    【解决方案2】:

    没有联合?

    既然没有GROUP BYCOUNT 返回1 个值,为什么不使用一次CROSS JOIN

    SELECT 
     t1.Cnt AS [T1], 
     t2.Cnt AS [T2], 
     t3.Cnt AS [T3],
     t4.Cnt AS [T4],
     (t1.Cnt + t2.Cnt + t3.Cnt + t4.Cnt) AS [T1234]
    FROM 
    (SELECT COUNT(*) AS Cnt FROM T1 WHERE [Date1] < CAST(GetDate()-3 AS DATE)) AS t1
    CROSS JOIN
    (SELECT COUNT(*) AS Cnt FROM T2 WHERE [Date1] < CAST(GetDate()-3 AS DATE)) AS t2
    CROSS JOIN
    (SELECT COUNT(*) AS Cnt FROM T3 WHERE [Date1] < CAST(GetDate()-3 AS DATE)) AS t3
    CROSS JOIN
    (SELECT COUNT(*) AS Cnt FROM T4 WHERE [Date1] < CAST(GetDate()-3 AS DATE)) AS t4
    

    CROSS APPLY

    SELECT 
     t1.Cnt AS [T1], 
     t2.Cnt AS [T2], 
     t3.Cnt AS [T3],
     t4.Cnt AS [T4],
     (t1.Cnt + t2.Cnt + t3.Cnt + t4.Cnt) AS [T1234]
    FROM (SELECT CAST(GetDate()-3 AS DATE) as Dt) d
    CROSS APPLY (SELECT COUNT(*) AS Cnt FROM T1 WHERE [Date1] < d.Dt) AS t1
    CROSS APPLY (SELECT COUNT(*) AS Cnt FROM T2 WHERE [Date1] < d.Dt) AS t2
    CROSS APPLY (SELECT COUNT(*) AS Cnt FROM T3 WHERE [Date1] < d.Dt) AS t3
    CROSS APPLY (SELECT COUNT(*) AS Cnt FROM T4 WHERE [Date1] < d.Dt) AS t4
    

    Sql Server 的示例 sn-p:

    declare @T1 table (id int primary key identity(1,1), [Date1] date);
    declare @T2 table (id int primary key identity(1,1), [Date1] date);
    declare @T3 table (id int primary key identity(1,1), [Date1] date);
    declare @T4 table (id int primary key identity(1,1), [Date1] date);
    
    insert into @T1 ([Date1]) values (getdate()-6),(getdate()-5),(getdate()-4),(getdate()-3),(getdate()-2),(getdate()-1),(getdate()-0);
    insert into @T2 ([Date1]) select top 6 [Date1] from @T1 order by [Date1] desc;
    insert into @T3 ([Date1]) select top 5 [Date1] from @T1 order by [Date1] desc;
    insert into @T4 ([Date1]) select top 4 [Date1] from @T1 order by [Date1] desc;
    
    SELECT 
     t1.Cnt AS [T1], 
     t2.Cnt AS [T2], 
     t3.Cnt AS [T3],
     t4.Cnt AS [T4],
     (t1.Cnt + t2.Cnt + t3.Cnt + t4.Cnt) AS [T1234]
    FROM 
    (SELECT COUNT(*) AS Cnt FROM @T1 WHERE [Date1] < CAST(GetDate()-3 AS DATE)) AS t1
    CROSS JOIN
    (SELECT COUNT(*) AS Cnt FROM @T2 WHERE [Date1] < CAST(GetDate()-3 AS DATE)) AS t2
    CROSS JOIN
    (SELECT COUNT(*) AS Cnt FROM @T3 WHERE [Date1] < CAST(GetDate()-3 AS DATE)) AS t3
    CROSS JOIN
    (SELECT COUNT(*) AS Cnt FROM @T4 WHERE [Date1] < CAST(GetDate()-3 AS DATE)) AS t4
    

    返回:

    T1  T2  T3  T4  T1234
    3   2   1   0   6
    

    【讨论】:

      【解决方案3】:

      嗯,你对一个父对象感兴趣,那就是一个视图。您可以将它重用于各种查询。或者,如果需要,添加更多列:

      CREATE VIEW parent AS
      SELECT Date1 FROM t1 UNION ALL
      SELECT Date1 FROM t2 UNION ALL
      SELECT Date1 FROM t3 UNION ALL
      SELECT Date1 FROM t4;
      

      现在,可以按照你想要的方式查询了

      SELECT COUNT(*) FROM parent WHERE Date1 <= DATEADD(DAY, -3, GETDATE())
      

      【讨论】:

        【解决方案4】:

        您可以使用 CTE(通用表表达式)来代替创建视图。它像视图一样工作,但不会保留在数据库上。请试一试:

        WITH CteDate( Date1 )
        AS ( SELECT Date1 FROM t1 UNION ALL
             SELECT Date1 FROM t2 UNION ALL
             SELECT Date1 FROM t3 UNION ALL
             SELECT Date1 FROM t4
            )
        SELECT COUNT(*) FROM CteDate WHERE Date1 <= DATEADD(DAY, -3, GETDATE())        
        

        它适用于所有大于或等于 2005 的 SQL Server。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-02-23
          • 2014-11-12
          • 2015-01-15
          • 2018-09-18
          • 1970-01-01
          • 2010-12-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多