【问题标题】:Difference in number of rows in two tables两个表的行数差异
【发布时间】:2011-06-10 07:14:55
【问题描述】:

如何计算两个不同表中的行数?

SQL> select count(*) from dual44;

  COUNT(*)
----------
         3

SQL> select count(*) from dual;

  COUNT(*)
----------
         1

SQL> (select count(*) from dual44)
  2  minus
  3  (select count(*) from dual)
  4  ;

  COUNT(*)
----------
         3

SQL> 

我需要2 作为结果。这两个表可能不一定具有相同的架构。

【问题讨论】:

    标签: sql oracle oracle11g sqlplus


    【解决方案1】:

    减号运算符用于删除第一个结果集中也包含在第二个结果集中的所有记录。在此处使用 -(破折号)运算符。

    select ((select count(*) from dual44) - (select count(*) from dual)) from dual
    

    【讨论】:

    • 我在破折号下面得到这个:ORA-00933: SQL 命令没有正确结束
    • 是的,你是对的,你必须将它嵌入到一个有效的选择查询中
    【解决方案2】:
    select count(*) - (select count(*) from dual)
    from dual44
    

    MINUS是SQL集合操作,这里不需要,直接使用-即可。

    【讨论】:

    • 我明白了:ORA-00937: not a single-group group function (below the second count(*))
    【解决方案3】:

    如果您的统计信息是最新的(强烈推荐),以下速度非常快(对于数亿条记录的表不到 1 秒)。

    select 
    (
    (select u.NUM_ROWS from user_tables u where u.TABLE_NAME='JOBS')
     - 
    (select u.NUM_ROWS from user_tables u where u.TABLE_NAME='COUNTRIES')
     ) DIFF
    from dual
    
    
         DIFF
    ----------
            -6
    

    示例代码适用于 ORACLE 的 HR 模式。您可以更改表名。

    这两个表可能不一定具有相同的架构。

    编辑 Jeffrey Kemp 的评论:

    如果表位于不同的架构上,则必须使用dba_tables(如果您有权限)。

    只需将架构名称添加到表名即可。即HR.JOBS

    【讨论】:

    • (1) 如果它们不在同一架构中,您将无法在 user_tables 中找到统计信息; (2) OP 从未指定他们只想要基于统计数据的粗略估计,也没有提到性能是一个问题。
    • @JeffreyKemp (1) 谢谢,你是对的,我已经更新了答案。 (2) 我认为性能是人们应该经常(如果不是总是)考虑的事情。是的,OP 没有指定,但特别是在 OLAP 数据库中,表不经常更新,这对我来说似乎是一种可行的方法。
    【解决方案4】:
    SELECT (a.count-b.count)
     FROM
       (SELECT COUNT(*) count FROM dual44) a,
       (SELECT COUNT(*) count FROM dual) b;
    

    【讨论】:

      【解决方案5】:

      Sqlite 中,这会起作用:

      Select (Select count(col1) from Table1) - (Select count(col2) from Table2)) 
      

      【讨论】:

        猜你喜欢
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多