美好的一天!
数据库有一个您要归档的表。该表的副本,添加了前缀名称“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)
);
部分代码可以正常运行,但通常无限期运行。
也许还有其他想法。
答案 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)。