2017-08-04 63 views
0

我有一套約500個模式,其中許多都有公共列。現在每當我有更新時,我都必須手動查看具有這些列的所有模式,並在有數據時進行更新。查找給定列中有數據的所有表

我試圖讓所有具有這些列的錶針對特定列數據的行數。

例如,可以說我在scehmas A,B和C中有col1列。我可以按照以下格式獲取數據。

Col1 table number 
1005 A  3 
1005 B  4 
1005 C  5 
1006 A  7 

其中1005是col1中的一行。 A是桌子。 3是表A中col1中有1005行的行數。

請原諒我的格式和缺乏查詢,因爲我從移動版發佈了此問題。

+0

通過架構你的意思是相對於調用該函數?..和行號,你是指元組標識符?..如果是這樣 - 可選。從information_schema.column獲得關係列表,其中column_name ='col1'',然後從關係where col1 = value'中選擇ctid。請記住,而不是「行號」,你最好有PK和使用它們,因爲行號隨着時間而改變 –

+0

嘿unkn0wn用戶,你可以請檢查答案,讓我知道,如果這是你所期待的? –

回答

1

創建以下功能及使用方法,對於數據

DROP FUNCTION IF EXISTS fun_test (CHARACTER VARYING); 

drop type if exists fun_test_out; 
create type fun_test_out as(
     "schema_name"  VARCHAR(255) 
    ,"table_name"  VARCHAR(255) 
    ,"column_value" VARCHAR(255) 
    ,"count"   INT 

); 

CREATE OR REPLACE FUNCTION fun_test (colname CHARACTER VARYING) 
    RETURNS SETOF fun_test_out 
AS 
$$ 
declare 
    r fun_test_out%rowtype; 
    l_colname VARCHAR(255); 
    l_cte  TEXT; 
    l_insert TEXT; 
    tables RECORD; 

begin 

l_colname := colname ; 

DROP TABLE IF EXISTS tmp_output; 
CREATE temp TABLE tmp_output 
(
     schema_name  VARCHAR(255) 
    ,table_name  VARCHAR(255) 
    ,column_value  VARCHAR(255) 
    ,count    INT 
); 

DROP TABLE IF EXISTS tmp_tablename; 
CREATE temp TABLE tmp_tablename 
(
     table_schema  VARCHAR(255) 
    ,table_name  VARCHAR(255) 
    ,column_name  VARCHAR(255) 
); 

l_cte := 'Insert into tmp_tablename ' || chr(10) || 
     'SELECT table_schema,table_name,column_name' || chr(10) || 
     'FROM information_schema.columns WHERE column_name = ''' || l_colname || '''' ; 

EXECUTE l_cte; 

FOR tables IN 
    SELECT table_schema,table_name,column_name 
    FROM tmp_tablename 
LOOP 

l_insert = 'Insert into tmp_output ' || chr(10) || 
     'SELECT ''' || tables.table_schema || ''',''' || tables.table_name || ''',' || tables.column_name || ',COUNT(*)' || chr(10) || 
     'FROM ' || tables.table_schema || '.' || tables.table_name || chr(10) || 
      'group by ' || tables.column_name 
     ; 

EXECUTE l_insert; 

END LOOP; 


/****************************************************************** 
        FINAL SELECT 
******************************************************************/ 

FOR r in 

select * 
from tmp_output 
loop 
RETURN NEXT r; 
END LOOP; 

DROP TABLE IF EXISTS tmp_output; 
DROP TABLE IF EXISTS tmp_tablename; 

end 
$$ 
LANGUAGE PLPGSQL; 

的提取您可以使用下面的語句

Select * from fun_test('Column_name'); 
相關問題