Oracle - 在所有表中搜索所有列中的数据
Posted
技术标签:
【中文标题】Oracle - 在所有表中搜索所有列中的数据【英文标题】:Oracle - Search in all tables with data only in all columns 【发布时间】:2017-04-02 13:52:08 【问题描述】:i',m 试图在所有列中包含数据的所有表中查找..
例子
ID = 123 的 EMPLOYEE 表
COLUMNS DATA
ID 1
NAME TEST
ADDRESS TESTADDRESS
PHONE
EMAIL
POSITION DEV
输出将是 ID、NAME、ADDRESS 和 POSITION.. 所以基本上所有列都只有数据..
顺便说一句,我不能依赖 USER_TAB_COLUMNS 中的 NUM_DISTINCT..
【问题讨论】:
该行并非所有列都有数据,因此该表没有。我完全不确定您要做什么。您是否尝试列出该表中包含该 ID 或任何 ID 数据的列名?或者在“所有表”中 - 这是什么,模式中的所有表?并再次基于特定的键?还是别的什么? 对您的要求有点困惑,您提到了搜索,但专注于问题中的显示。似乎你可能有两个问题在这里你想结合起来。 【参考方案1】:您可以收集表的统计信息并检查DBA_TAB_COL_STATISTICS
中的NUM_NULLS
列。 documentation 中描述了所有内容。
如果由于某种原因你不能这样做,那么使用类似这个简单的 PL/SQL 块:
declare
v_nulls number;
v_sql varchar(4000);
begin
for t in (select table_name from user_tables order by table_name)
loop
dbms_output.put_line('====== Table: '||t.table_name);
for c in (select column_name
from user_tab_cols
where table_name = t.table_name order by column_name)
loop
v_sql := 'select count(case when '||c.column_name||' is null then 1 end) '
||' from '||t.table_name;
execute immediate v_sql into v_nulls;
if v_nulls = 0 then
dbms_output.put_line(rpad(c.column_name, 30)||' - no nulls found');
else
dbms_output.put_line(rpad(c.column_name, 30)||' - contains null values');
end if;
end loop;
end loop;
end;
样本输出:
====== Table: CARS
CID - no nulls found
MODEL - contains null values
PID - contains null values
====== Table: PEOPLE
NAME - no nulls found
PID - no nulls found
我们正在为架构中每个表中的每一列计算空值,因此这可能会很慢。收集统计数据是做这些事情的正确方法。
例如,如果您需要有关表 Employee
和 Courses
中列的信息,请在第一个循环中添加正确的 where clause
。
select table_name from user_tables where table_name in ('Employee', 'Courses')
【讨论】:
以上是关于Oracle - 在所有表中搜索所有列中的数据的主要内容,如果未能解决你的问题,请参考以下文章