2017-01-10 3 views
0

特定の列名を含むすべての表の名前を取得しようとしています。この列名を持つこれらのテーブルのすべてについて、その列の特定の値を持つテーブルを取得したいと考えています。SQLでUSER_TAB_COLLSを使用して列から値を取得する

テーブルのリストを取得するために使用されているクエリは、次のとおりです。

SELECT COLUMN_NAME, TABLE_NAME 
FROM USER_TAB_COLS 
WHERE COLUMN_NAME LIKE 'USER_ID'; 

Plsは私はこのクエリを完了するのに役立ちます。私はSQLに新しいです。 例:

WEB_APPLICATION (TABLE-1) 
USER_ID NAME GENDER 
abc  ABC M 

DESKTOP_APPLICATION (TABLE-2) 
LOGIN_ID NAME GENDER 
bcd  BCD F 

MOBILE_APPLICATION(TABLE-3) 
USER_ID NAME GANDER 
abc  ABC F 

EXPECTED OUTPUT: 
TABLE_NAME   GENDER 
WEB_APPLICATION  M 
MOBILE_APPLICATION F 

は、今私は、列USER_IDとABCとしての価値を持つテーブルを取得したいです。

私はこの周りに自分自身を明確にしました。

+0

特定のテーブルの列に何千もの行がある場合はどうなりますか?あなたの出力はどのように見えますか? – GurV

+0

これはどのようにして完了するのですか? USER_TAB_COLSで選択を実行している場合、列の値にアクセスする方法はありますか? –

+0

あります。あなたの出力はどのように見えますか?どのようにそれを期待していますか? – GurV

答えて

1

これは動的SQLが必要なため、PL/SQLで実行できます。

declare 
cursor TABS is 
    SELECT TABLE_NAME 
    FROM USER_TAB_COLS 
    GROUP BY TABLE_NAME 
    HAVING COUNT(
    CASE 
     WHEN COLUMN_NAME IN ('USER_ID','GENDER') 
    THEN 1 END 
) = 2; 
    type tab is table of varchar(100) index by pls_integer; 
    v_tab tab; 
begin 
    for t in TABS loop 
    execute immediate 'select gender from ' ||t.table_name bulk collect into v_tab; 
    if v_tab.count > 0 then 
     for i in v_tab.first..v_tab.last loop 
     dbms_output.put_line(t.table_name ||' '|| v_tab(i)); 
     end loop; 
    end if; 
    end loop; 
end; 
/
1

このクエリでは、あなたが必要な取得、それを実行する場合は、次のような命令

select 'MOBILE_APPLICATION' table_name, gender from MOBILE_APPLICATION where USER_ID = 'abc' UNION ALL 
select 'WEB_APPLICATION' table_name, gender from WEB_APPLICATION where USER_ID = 'abc'; 

を取得

select 
'select '''||table_name||''' table_name, gender from '|| table_name || 
' where USER_ID = ''abc''' || 
case when rn != 1 then ' UNION ALL ' end as sql_txt 
from (
select table_name, 
row_number() over (order by table_name desc) as rn 
from (
select table_name from user_tab_columns where column_name = 'GENDER' 
INTERSECT 
select table_name from user_tab_columns where column_name = 'USER_ID' 
)) order by table_name; 

がそれを実行している(各テーブルに1つの行)に必要なSQL文を作成し、結果

TABLE_NAME   GENDER 
------------------ ------ 
MOBILE_APPLICATION F  
WEB_APPLICATION M 

サンプルデータ

create table WEB_APPLICATION as 
select 'abc' USER_ID, 'ABC' NAME, 'M' GENDER from dual; 

create table DESKTOP_APPLICATION as 
select 'bcd' LOGIN_ID, 'BCD' NAME, 'F' GENDER from dual; 

create table MOBILE_APPLICATION as 
select 'abc' USER_ID, 'ABC' NAME, 'F' GENDER from dual; 
関連する問題