【问题标题】:Select count(*) from multiple tables从多个表中选择 count(*)
【发布时间】:2010-10-11 00:16:41
【问题描述】:

如何从两个不同的表中选择count(*)(称它们为tab1tab2),结果如下:

Count_1   Count_2
123       456

我试过了:

select count(*) Count_1 from schema.tab1 union all select count(*) Count_2 from schema.tab2

但我只有:

Count_1
123
456

【问题讨论】:

    标签: sql oracle count


    【解决方案1】:
    SELECT  (
            SELECT COUNT(*)
            FROM   tbl1
            )
            +
            (
            SELECT COUNT(*)
            FROM   tbl2
            ) 
        as TotalCount
    

    【讨论】:

      【解决方案2】:
          select 
          t1.Count_1,t2.Count_2
          from 
      (SELECT count(1) as Count_1 FROM tab1) as t1, 
      (SELECT count(1) as Count_2 FROM tab2) as t2
      

      【讨论】:

        【解决方案3】:

        选择 (select count() from tab1 where field like 'value') + (select count() from tab2 where field like 'value') 数

        【讨论】:

          【解决方案4】:
          --============= FIRST WAY (Shows as Multiple Row) ===============
          SELECT 'tblProducts' [TableName], COUNT(P.Id) [RowCount] FROM tblProducts P
          UNION ALL
          SELECT 'tblProductSales' [TableName], COUNT(S.Id) [RowCount] FROM tblProductSales S
          
          
          --============== SECOND WAY (Shows in a Single Row) =============
          SELECT  
          (SELECT COUNT(Id) FROM   tblProducts) AS ProductCount,
          (SELECT COUNT(Id) FROM   tblProductSales) AS SalesCount
          

          【讨论】:

            【解决方案5】:
            Declare @all int
            SET @all = (select COUNT(*) from tab1) + (select count(*) from tab2)
            Print @all
            

            SELECT (select COUNT(*) from tab1) + (select count(*) from tab2)
            

            【讨论】:

              【解决方案6】:

              加入不同的表

              SELECT COUNT(*) FROM (  
              SELECT DISTINCT table_a.ID  FROM table_a JOIN table_c ON table_a.ID  = table_c.ID   );
              

              【讨论】:

                【解决方案7】:

                这是我的分享

                选项 1 - 从不同表的相同域计数

                select distinct(select count(*) from domain1.table1) "count1", (select count(*) from domain1.table2) "count2" 
                from domain1.table1, domain1.table2;
                

                选项 2 - 从不同域计算同一张表

                select distinct(select count(*) from domain1.table1) "count1", (select count(*) from domain2.table1) "count2" 
                from domain1.table1, domain2.table1;
                

                选项 3 - 使用“联合所有”从不同域为同一个表计数以具有计数行

                select 'domain 1'"domain", count(*) 
                from domain1.table1 
                union all 
                select 'domain 2', count(*) 
                from domain2.table1;
                

                享受 SQL,我总是这样做:)

                【讨论】:

                  【解决方案8】:

                  SELECT (SELECT COUNT(*) FROM table1) + (SELECT COUNT(*) FROM table2) FROM dual;

                  【讨论】:

                    【解决方案9】:

                    为了完整起见 - 此查询将创建一个查询,为您提供给定所有者的所有表的计数。

                    select 
                      DECODE(rownum, 1, '', ' UNION ALL ') || 
                      'SELECT ''' || table_name || ''' AS TABLE_NAME, COUNT(*) ' ||
                      ' FROM ' || table_name  as query_string 
                     from all_tables 
                    where owner = :owner;
                    

                    输出类似于

                    SELECT 'TAB1' AS TABLE_NAME, COUNT(*) FROM TAB1
                     UNION ALL SELECT 'TAB2' AS TABLE_NAME, COUNT(*) FROM TAB2
                     UNION ALL SELECT 'TAB3' AS TABLE_NAME, COUNT(*) FROM TAB3
                     UNION ALL SELECT 'TAB4' AS TABLE_NAME, COUNT(*) FROM TAB4
                    

                    然后你可以运行它来计算你的计数。有时它只是一个方便的脚本。

                    【讨论】:

                    • 我喜欢这个答案,但我认为您应该将所有者添加到查询的“FROM”部分。否则,您必须使用可能无法直接获得的所有者执行查询。
                    【解决方案10】:

                    作为附加信息,要在 SQL Server 中完成同样的事情,您只需删除查询的“FROM dual”部分。

                    【讨论】:

                    • 当我看到您的评论时,我正准备说“但是 MS SQL 呢。感谢您预见到需要!
                    【解决方案11】:

                    想出了一个快速的尝试:

                    Select (select count(*) from Table1) as Count1, (select count(*) from Table2) as Count2
                    

                    注意:我在 SQL Server 中对此进行了测试,因此不需要From Dual(因此存在差异)。

                    【讨论】:

                    • 我也在 Postgres 中测试过,'From Dual' 也是不必要的。
                    【解决方案12】:
                    select @count = sum(data) from
                    (
                    select count(*)  as data from #tempregion
                    union 
                    select count(*)  as data from #tempmetro
                    union
                    select count(*)  as data from #tempcity
                    union
                    select count(*)  as data from #tempzips
                    ) a
                    

                    【讨论】:

                    • 欢迎来到 StackOverflow 并感谢您的发帖。请看How to Answer
                    • 这个答案是错误的。不能使用 union(应该使用 union all)。
                    【解决方案13】:

                    因为我看不到任何其他答案,所以提出了这个问题。

                    如果您不喜欢子查询并且在每个表中都有主键,您可以这样做:

                    select count(distinct tab1.id) as count_t1,
                           count(distinct tab2.id) as count_t2
                        from tab1, tab2
                    

                    但在性能方面,我相信 Quassnoi 的解决方案更好,而且我会使用。

                    【讨论】:

                      【解决方案14】:
                      SELECT  (
                              SELECT COUNT(*)
                              FROM   tab1
                              ) AS count1,
                              (
                              SELECT COUNT(*)
                              FROM   tab2
                              ) AS count2
                      FROM    dual
                      

                      【讨论】:

                      • 为什么需要双重?这是什么意思?
                      • 这是一张只有一条记录的假表。在 Oracle 中,如果没有 FROM,您将无法使用 SELECT。
                      • dual 是 oracle 数据库中的一个表,所有帐户都可以访问它,您可以将其用于常见需求,例如:“SELECT sysdate FROM dual”
                      • 没什么区别,Oracle 不会评估 COUNT(*) 中的任何内容。
                      • @Stéphane:当您在 PostgreSQL 上尝试 Oracle 代码时会发生这种情况。丢失FROM dual
                      【解决方案15】:

                      其他略有不同的方法:

                      with t1_count as (select count(*) c1 from t1),
                           t2_count as (select count(*) c2 from t2)
                      select c1,
                             c2
                      from   t1_count,
                             t2_count
                      /
                      
                      select c1,
                             c2
                      from   (select count(*) c1 from t1) t1_count,
                             (select count(*) c2 from t2) t2_count
                      /
                      

                      【讨论】:

                        【解决方案16】:

                        只是因为略有不同:

                        SELECT 'table_1' AS table_name, COUNT(*) FROM table_1
                        UNION
                        SELECT 'table_2' AS table_name, COUNT(*) FROM table_2
                        UNION
                        SELECT 'table_3' AS table_name, COUNT(*) FROM table_3
                        

                        它给出了转置的答案(每表一行而不是一列),否则我认为它没有太大不同。我认为在性能方面它们应该是等效的。

                        【讨论】:

                        • 你最好把UNION ALL放在这里。
                        • 添加“ALL”会对三个单行查询产生什么影响?结果肯定是一样的吗?
                        • UNION 没有所有组结果。如果 table_1 和 table_2 有 2 行,table_3 有 3 行,您将在结果集中得到两行,并且无法从结果集中判断 table_2 有多少行:2 或 3。
                        • 是的,但是我选择了表名,这使得结果独一无二。否则你是对的,但是没有上下文的几个数字会有什么价值? ;-)
                        • 这也是对每个计数使用 CTE (WITH SELECT) 语句的好方法。
                        【解决方案17】:

                        如果表(或至少一个键列)属于同一类型,只需先进行联合,然后计算。

                        select count(*) 
                          from (select tab1key as key from schema.tab1 
                                union all 
                                select tab2key as key from schema.tab2
                               )
                        

                        或者把你的 satement 放在另一个 sum() 周围。

                        select sum(amount) from
                        (
                        select count(*) amount from schema.tab1 union all select count(*) amount from schema.tab2
                        )
                        

                        【讨论】:

                          【解决方案18】:

                          我的经验是使用 SQL Server,但你能做到吗:

                          select (select count(*) from table1) as count1,
                            (select count(*) from table2) as count2
                          

                          在 SQL Server 中,我得到了你想要的结果。

                          【讨论】:

                            【解决方案19】:
                            select (select count(*) from tab1) count_1, (select count(*) from tab2) count_2 from dual;
                            

                            【讨论】:

                              猜你喜欢
                              • 2011-10-06
                              • 1970-01-01
                              • 2013-02-02
                              • 2021-09-03
                              • 1970-01-01
                              • 1970-01-01
                              • 2012-12-03
                              • 1970-01-01
                              • 1970-01-01
                              相关资源
                              最近更新 更多