从列具有特定值的所有表中选择表名

Posted

技术标签:

【中文标题】从列具有特定值的所有表中选择表名【英文标题】:select table name from all tables where column has specific value 【发布时间】:2020-08-20 13:16:27 【问题描述】:

我需要 类似:

select table_name from all_tab_columns where column_name = 'VALUE';

但有值条件 谢谢

【问题讨论】:

它没有说清楚你想要什么?您要检查 column_name 的表是否包含 %VALUE% 或针对列的实际值? 【参考方案1】:

您想要的是搜索数据库中的所有列,其中一些值如“ABC”和此类表的列表。

为此,您必须编写一个动态脚本来在一个表中选择一个表并搜索该表中的所有列并循环遍历它。

【讨论】:

【参考方案2】:

嗯,不清楚你在问什么,是表的列名还是列本身的实际值。

我猜这是第二个,因为你已经知道第一个了。 Oracle 不会在任何字典视图中存储列值,因为它没有意义。值存储在相应的表中。

因此,一种方法可以使用 PL/SQL,但如果您的数据库很大,则需要很长时间。在我的示例中,我正在寻找一个字符串,我可以通过仅应用于数据类型为 varchar2 或 char 的列来限制该字符串,并且当我正在寻找一个特定值时,我丢弃所有长度低于该值的列我正在寻找。

set serveroutput on size unlimited echo on verify off timing on 
declare
vowner varchar2(128);
vtable varchar2(128);
vcolum varchar2(128);
vvalue varchar2(40) := 'TEST_TABLE';
vcount pls_integer;
begin
for c in ( select owner , table_name from all_tables order by 1 , 2 )
loop 
    vowner := c.owner;
    vtable := c.table_name ;
    for h in ( select column_name from all_tab_columns where owner = vowner and table_name = vtable 
               and data_type in ( 'CHAR' ,  'VARCHAR2' ) and data_length >= length(vvalue) 
               order by column_id )
    loop
        vcolum := h.column_name;
        execute immediate ' select count(*) from '||vowner||'.'||vtable||' where upper('||vcolum||') = '''||vvalue||''' ' into vcount ;
        if vcount > 0
        then 
            dbms_output.put_line('Found '||vvalue||' in table --> '||vowner||'.'||vtable||' | column --> '||vcolum||' ');
        end if;
    end loop;
end loop;
end;
/

我限制要查找的表的示例

SQL> set serveroutput on size unlimited echo on verify off timing on lines 200
declare
vowner varchar2(128);
vtable varchar2(128);
vcolum varchar2(128);
vvalue varchar2(40) := 'TEST_TABLE';
vcount pls_integer;
begin
for c in ( select owner , table_name from all_tables where owner = 'TEST_PERF' order by 1 , 2 )
loop
        vowner := c.owner;
        vtable := c.table_name ;
        for h in ( select column_name from all_tab_columns where owner = vowner and table_name = vtable and data_type in ( 'CHAR' ,  'VARCHAR2' ) and data_length >= length(vvalue)  order by column_id )
        loop
                vcolum := h.column_name;
                execute immediate ' select count(*) from '||vowner||'.'||vtable||' where upper('||vcolum||') = '''||vvalue||''' ' into vcount ;
                if vcount > 0
                then
                      dbms_output.put_line('Found '||vvalue||' in table --> '||vowner||'.'||vtable||' | column --> '||vcolum||' ');
                end if;
      end loop;
end loop;
end;
/

Found TEST_TABLE in table --> TEST_PERF.T | column --> C1
Found TEST_TABLE in table --> TEST_PERF.TEST_OBJECTS | column --> OBJECT_NAME

PL/SQL procedure successfully completed.

Elapsed: 00:00:17.29
SQL>

【讨论】:

以上是关于从列具有特定值的所有表中选择表名的主要内容,如果未能解决你的问题,请参考以下文章

SQL VBA:选择具有特定表名和字段名的所有表

使用SQL Server和Mysql查询所有数据库名表名和字段名

从每个 id 具有特定值的表中选择行

在数据库中搜索列中具有特定值的所有表

在数据库中搜索列中具有特定值的所有表

从具有相同值的两个表中选择数据后结果重复