oracle查询出两个表内字段相同但数据量不同的表名字

查询数据库表名字(表的数据量不同),两个表的字段相同,数据量不相同的表筛选出来

这个题目有点歧义,两个表字段相同是指的所有字段名都相同还是只有部分字段名相同?还有字段顺序是否需要考虑?
我先假设你说的是所有字段名都相同且字段顺序也一致的两个表吧,因为部分字段名相同的太多了
然后你也没说你的版本是多少,在不同版本里是可以借用不同的函数来达到同样的效果的,比如下面这个sql在21c版本里可以运行

select owner1,
       table_name1,
       nvl(x1.num_rows, 0) num_rows1,
       owner2,
       table_name2,
       nvl(x2.num_rows, 0) num_rows2
  from (select t1.owner      owner1,
               t1.table_name table_name1,
               t2.owner      owner2,
               t2.table_name table_name2
          from (select a.owner,
                       a.table_name,
                       json_objectagg('k',
                                      a.column_name returning varchar2(32767)) c
                  from dba_tab_cols a
                 group by a.owner, a.table_name) t1,
               (select a.owner,
                       a.table_name,
                       json_objectagg('k',
                                      a.column_name returning varchar2(32767)) c
                  from dba_tab_cols a
                 group by a.owner, a.table_name) t2
         where t1.c = t2.c
           and t1.table_name <> t2.table_name) x,
       dba_tables x1,
       dba_tables x2
 where x.owner1 = x1.owner
   and x.table_name1 = x1.table_name
   and x.owner2 = x2.owner
   and x.table_name2 = x2.table_name
   and nvl(x1.num_rows, 0) <> nvl(x2.num_rows, 0)

img

其实主要就是两个处理方向,
一种是按字段一个个匹配,用count条件来判断匹配上的行(字段)和两张表各自的行(字段)是否都相等,相等则说明字段一样;
另外一种方式就是上面这个sql这种,将所有字段按顺序拼成一个值,再来判断这个值是否相等即可。
至于行数,这里是可能存在问题的,这个行数和当前实际行数不一定匹配,必须要收集一次统计信息后行数才会更新