检查表中的所有列名称

时间:2014-11-17 08:21:34

标签: sql oracle

美好的一天!

数据库有一个您要归档的表。该表的副本,添加了前缀名称“ARCH _”。

e.g。表:平衡。存档表:ARCH_BALANCE。

我需要编写一个查询来检查:表“ARCH_%”中的表示基表的所有字段。 *还有一个未归档的数据库表。

我写了以下查询:

    select distinct COLUMN_NAME, TABLE_NAME
from ALL_TAB_COLUMNS res
where TABLE_NAME in(
  SELECT TABLE_NAME  
  FROM all_tables core_t
  where TABLE_NAME not like 'ARCH_%' AND
  EXISTS (
    SELECT TABLE_NAME 
    FROM all_tables hist_t
    WHERE hist_t.TABLE_NAME  = concat('ARCH_', core_t.TABLE_NAME)

  )
) and COLUMN_NAME NOT IN (
  select COLUMN_NAME 
  from ALL_TAB_COLUMNS 
  where TABLE_NAME  = concat('ARCH_', res.TABLE_NAME)
);

部分代码可以正常运行,但通常无限期运行。

也许还有其他想法。

2 个答案:

答案 0 :(得分:2)

此查询连接表和列,并显示它们共有的字段,如果有一个缺失,则在第四列中显示:

select orig.column_name
,      arch.column_name
,      case
       when orig.column_name is null
       then 'column doesn''t exist in orig'
       when arch.column_name is null
       then 'column doesn''t exist in arch'
       else 'exists in both'
       end
       status
from   ( select table_name
         ,      column_name
         from   all_tab_columns
         where  table_name = 'X'
       )
       orig
full
outer
join   ( select table_name
         ,      column_name
         from   all_tab_columns
         where  table_name = 'ARCH_X'
       )
       arch
on     orig.column_name = arch.column_name

答案 1 :(得分:1)

问题可能在于查询的那部分:

 SELECT TABLE_NAME  
  FROM all_tables core_t
  where TABLE_NAME not like 'ARCH_%' AND
  EXISTS (
    SELECT TABLE_NAME 
    FROM all_tables hist_t
    WHERE hist_t.TABLE_NAME  = concat('ARCH_', core_t.TABLE_NAME)

  )

您正在尝试同时获取与2个condidtion匹配的记录: 1)TABLE_NAME不喜欢'ARCH_%' 2)TABLE_NAME = concat('ARCH _',TABLE_NAME)

这两个条件保持在相反的方面。

您还可以修改列名称的前缀(TABLE_NAME可以来自ALL_TAB_COLUMNS表或ALL_TABLES)。