Oracle数据库中,知道一个值,如何查询它所在的表,是哪个字段?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle数据库中,知道一个值,如何查询它所在的表,是哪个字段?相关的知识,希望对你有一定的参考价值。

举个例子,我知道有个值是:1009A11000000000QP7R, 我要查出在哪些表,哪些字段下面有这个值。最好能详细点,谢谢

--oracle无穷解查询数据库中的所有数据
--TEST0418为表属于的用户(不知道哪个用户,可以用语句查已知表名,
--表所属的用户--可百度)
--1001E71000000002RWGW :为所查询的内容,也可改为模糊查询
DECLARE
V_SQL VARCHAR2(2000);
V_COUNT NUMBER;
BEGIN
FOR XX IN (SELECT TABLE_NAME,COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE OWNER='TEST0418' ) LOOP --WHERE OWNER='TEST0418'
BEGIN
V_SQL:= 'SELECT COUNT(1) FROM TEST0418.'||XX.TABLE_NAME ||' WHERE '||XX.COLUMN_NAME||' = ''1001E71000000002RWGW'' '; /*LIKE ''%123%'' ';*/
EXECUTE IMMEDIATE V_SQL INTO V_COUNT;
IF(V_COUNT>=1) THEN
DBMS_OUTPUT.PUT_LINE('SELECT TEST0418.'||XX.COLUMN_NAME ||' FROM '||XX.TABLE_NAME ||' WHERE '||XX.COLUMN_NAME||' = ''1001E71000000002RWGW'' '); /*LIKE ''%123%'' ');*/
END IF;
EXCEPTION
WHEN OTHERS THEN NULL;
END;
END LOOP;
END;
参考技术A 这个只能遍历所有表实现了。。。
写个循环倒是可以实现,不过对数据库的压力应该会很大
参考技术B 你可以使用下面两张表进行关联 进行查询
select * from dba_tab_columns;
select * from dba_objects

或者
select A.table_name,B.column_name
from user_tables A,user_tab_columns B
where A.table_name=B.table_name and B.Column_name=‘’
参考技术C 查询对应的column? 请把问题说的具体点 参考技术D 需要有关这个值更多的信息,找到通用的办法并不现实。。。比如我知道一个值是 5,整个数据库至少有几千万记录包含这个数字,怎么知道你到底想看什么?追问

这个没关系。我就要找到所有有这个值的字段名和表。目前我要查询的值(20个字符)应该没那么多。我随便查询了几个表,都没有。

追答

我有2个想法
1 用spool把所有可能的表的数据都写出到文本文件,然后在文本文件里面搜索
2 直接写查询语句构建sql,写成一个脚本,对每个表的所有列进行查询,用like方式查你的数据。感觉需要写pl/sql

带有子查询的 Oracle 更新 - 性能问题

【中文标题】带有子查询的 Oracle 更新 - 性能问题【英文标题】:Oracle update with subquery - performanceissue 【发布时间】:2013-10-31 09:27:24 【问题描述】:

我的 oracle 数据库中的更新语句出现问题。 查询需要很长时间,并且临时表空间空间不足,但它提供了正确的数据。

我试图将子查询转换为联接,但我不知道如何正确地做到这一点。 如果有人知道如何改进语句或如何将其转换为联接,我将不胜感激。

        UPDATE table1 t1
        SET t1.inxdc = (SELECT sda_x
           FROM table2 t2
           WHERE t1.c1 = t2.c1
             AND t1.c2 = t2.c2
             AND t1.c3 = t2.c3
             AND t1.c4 = t2.c4
             AND t1.c5 = t2.c5
             AND t1.c6 = t2.c6
             AND t2.ident = 'K_SDA_W'
             AND rownum=1)
      WHERE EXISTS
          (SELECT 1
           FROM table2 t2
           WHERE t1.c1 = t2.c1
             AND t1.c2 = t2.c2
             AND t1.c3 = t2.c3
             AND t1.c4 = t2.c4
             AND t1.c5 = t2.c5
             AND t1.c6 = t2.c6
             AND t2.ident = 'K_SDA_W');

编辑1: 表格的一些信息

table1 PK = c1,c2,c3,c4,c5,c6 table2 PKs = ident,c4,c5,c6,以及声明中未提及的其他 3 个 (c7,c8,c9) 索引:除了 PK 仅在 table2 c1 上 table1 数据:12466 行 table2 数据:194827 行

编辑2: 执行计划

    --------------------------------------------------------------
    | Id  | Operation                     | Name                 |
    --------------------------------------------------------------
    |   0 | UPDATE STATEMENT              |                      |
    |   1 |  UPDATE                       | table1               |
    |   2 |   NESTED LOOPS SEMI           |                      |
    |   3 |    TABLE ACCESS FULL          | table1               |
    |   4 |    TABLE ACCESS BY INDEX ROWID| table2               |
    |   5 |     INDEX RANGE SCAN          | t2.c1                |
    |   6 |   COUNT STOPKEY               |                      |
    |   7 |    TABLE ACCESS BY INDEX ROWID| table2               |
    |   8 |     INDEX RANGE SCAN          | t2.PK                |
    --------------------------------------------------------------

【问题讨论】:

T1 和 T2 哪个更大? T1和T2的PK是多少?有索引吗? 您的表有多大,运行此更新需要多长时间?你能告诉我们执行计划吗?子查询是否使用一些索引?从table1 中的一个相关行的子查询中检索一个值需要多长时间? 为什么 rownum = 1? T2中是否有重复项?这是否意味着 T2 > T1 的大小?计划在说什么! 【参考方案1】:

Table1 中的行数很少,在这种特殊情况下只需删除WHERE 子句,并将NVL 添加到从子查询返回的值:

UPDATE table1 t1
        SET t1.inxdc = NVL((SELECT sda_x
           FROM table2 t2
           WHERE t1.c1 = t2.c1
             AND t1.c2 = t2.c2
             AND t1.c3 = t2.c3
             AND t1.c4 = t2.c4
             AND t1.c5 = t2.c5
             AND t1.c6 = t2.c6
             AND t2.ident = 'K_SDA_W'
             AND rownum=1), t1.inxdc);

一般来说你的更新应该很快,你检查过子查询的性能吗?检查table2 上是否为子查询使用了索引(以及哪个索引)(最好向我们展示执行计划)。

【讨论】:

【参考方案2】:

我认为表 t2 应该在 c1,c2,c3, c4,c5,c6,ident 上有一个索引 在这种情况下,t1 的更新应该会更快。

【讨论】:

以上是关于Oracle数据库中,知道一个值,如何查询它所在的表,是哪个字段?的主要内容,如果未能解决你的问题,请参考以下文章

oracle中已经知道一个具体值,如何根据该值查询出含有该值的表名和列名?

我知道字段内容,并不知道字段名,如何在数据库中快速找到或查询出所在的表?SQL SERVER 2000。

sql 数据库中只靠一个数据,查询到所在表和列名

知道Oracle数据库中某个表里面某个字段有某个值,现在想找出这个表示哪个,SQL语句该怎么写?

查询oracle表中字段中某数据的命令

ORACLE中with的用法