如果是oracle,如何自动将别名更改为表名?

问题描述 投票:-1回答:1

我们目前正在分析数百个查询。

E.g

SELECT a.id,
       a.name,
       a.hobby,
       b.desc
FROM   tablename a,
       table2    b
WHERE  a.id = b.id;

要么

SELECT id,
       NAME,
       hobby
FROM   tablename;

以上这些可以改变如下吗?

SELECT tablename.id,
       tablename.name,
       tablename.hobby,
       table2.desc
FROM   tablename tablename,
       table2    table2
WHERE  tablename.id = table2.id;

要么

SELECT tablename.id,
       tablename.name,
       tablename.hobby
FROM   tablename tablename;

您是否知道任何能够更改它们的工具或方法?

oracle alias
1个回答
0
投票

这是另一个查询的匿名块:

 declare
    v_query varchar2(4000) :='SELECT a.id,
           a.name,
           a.hobby,
           b.desc
    FROM   tablename a,
           table2    b
    WHERE  a.id = b.id';
    tab_list varchar2(4000);
    v_newquery varchar2(4000);
    v_tab_alias varchar2(100);
    v_tabname varchar2(500);
    v_alias varchar2(40);
    tab_cnt NUMBER :=0;

    begin
    -- table list
    select replace(REGEXP_SUBSTR(regexp_replace(v_query,'FROM|WHERE','@'),'[^@]+',1,2)||chr(10),chr(10),null)
    into tab_list
    from dual;

    -- no of tables 
    select REGEXP_COUNT(TRIM(REGEXP_SUBSTR(regexp_replace(v_query,'FROM|WHERE','@'),'[^@]+',1,2)),',')+1
    into tab_cnt
    from dual;

    For i in 1..tab_cnt
    LOOP

    select TRIM(REGEXP_SUBSTR(tab_list,'[^,]+',1,i))
    into v_tab_alias
    from dual;

    -- replace alias tablename for the column list

    select TRIM(REGEXP_SUBSTR(v_tab_alias,'[^ ]+',1,1))
    into v_tabname
    from dual;

    select TRIM(REGEXP_SUBSTR(v_tab_alias,'[^ ]+',1,2))
    into v_alias
    from dual;

    select regexp_replace(v_query,v_alias||'\.',v_tabname||'.')  
    into v_newquery
    from dual;

    v_query:= v_newquery;

    -- replace alias tablename in FROM clause
    select regexp_replace(v_query,v_alias||'\,',v_tabname||',')  
    into v_query
    from dual;

    END LOOP;

    -- replace alias last tablename before WHERE clause
    select regexp_replace(v_query,v_tab_alias,v_tabname||' '||v_tabname)  
    into v_query
    from dual;

    DBMS_OUTPUT.PUT_LINE(v_query);

    END;
© www.soinside.com 2019 - 2024. All rights reserved.