select a.table_name from ( select table_name, sum(seqid) as allcolsid from user_tab_columns a, ( select column_name,rownum+1 as seqid from ( select distinct column_name from user_tab_columns ) ) b where a.COLUMN_NAME=b.column_name group by table_name ) a, ( select table_name, sum(seqid) as allcolsid from user_tab_columns a, ( select column_name,rownum+1 as seqid from ( select distinct column_name from user_tab_columns ) ) b where a.COLUMN_NAME=b.column_name and a.TABLE_NAME='你的表名' group by TABLE_NAME ) b where a.allcolsid=b.allcolsid;
原理很简单,给每个字段都设置一个唯一数值型编号,然后,将你指定表的字段编号相加。然后,再将系统中的所有用户表的字段编号相加。最后,汇总字段编号相同的,就是你要查找的表。如果,你说的表结构,不仅仅是字段名,还包含了字段类型及长度的话,可以稍微修改一下,替换为: select distinct column_name||data_type as column_name from user_tab_columns如果包含字段长度,方法同理
如果只是用 IN 的话,结果就包含了许多不需要的结果(一个字段对映上,但其它字段没对应上)。如, 字段 A 对上了,但 字段 B、C 是无法对映的。
select wm_concat(column_name) from user_tab_columns) WHERE table_name='JOBS';
查询基表/系统视图:sys.tab$,dba_tab_cols,sys.obj$中关于两表的字段信息,主要有:column_name,data_type,data_length,data_precision,data_scale等。
将两表的上述信息分别用sqlldr或其它工具导出成文本文件形式。用操作系统的文件比较工具比较两文本文件是否完全一致。
select a.table_name
from
(
select table_name, sum(seqid) as allcolsid
from user_tab_columns a,
(
select column_name,rownum+1 as seqid from
(
select distinct column_name from user_tab_columns
)
) b
where a.COLUMN_NAME=b.column_name
group by table_name
) a,
(
select table_name, sum(seqid) as allcolsid
from user_tab_columns a,
(
select column_name,rownum+1 as seqid from
(
select distinct column_name from user_tab_columns
)
) b
where a.COLUMN_NAME=b.column_name and a.TABLE_NAME='你的表名'
group by TABLE_NAME
) b
where a.allcolsid=b.allcolsid;
select distinct column_name||data_type as column_name from user_tab_columns如果包含字段长度,方法同理