2016-01-08 40 views
0

我不確定爲什麼第二個查詢失敗,我只在第二個查詢中添加caluse,因爲我不需要子錶行數。如何檢索排除子表的所有表的行計數

SQL工作正常

SELECT count(*) AS rows_cnt 
FROM (
    SELECT pgc.relname 
    FROM pg_class pgc 
    WHERE pgc.oid = 16424 
) as tblname 

SQL面臨的ISSUE

SELECT count(*) AS rows_cnt 
FROM ONLY ( 
    SELECT pgc.relname 
    FROM pg_class pgc 
    WHERE pgc.oid = 16424 
) as tblname 

這裏的 「16424」 是我的表OID。

任何人都可以告訴我我的SQL有什麼問題。

更新上面的問題:

SELECT count(*) AS rows_cnt 
FROM ONLY "test-1" 

「測試1」是OID 16424的表的名稱,它工作正常,但是當我使用子查詢來動態生成的表名失敗以下錯誤不知道爲什麼。

ERROR: syntax error at or near "SELECT" 
LINE 1: (SELECT count(*) AS rows_cnt FROM ONLY (SELECT pgc.relname ... 
              ^
********** Error ********** 

ERROR: syntax error at or near "SELECT" 
SQL state: 42601 
Character: 42 
+0

@a_horse_with_no_name:嗨,當我硬編碼表名(的第二個查詢16424 oid)它工作正常。 – n33rma

+0

嘗試[this](http://www.postgresql.org/docs/8.2/static/sql-select.html),頂部部分似乎使用了'ONLY'語句,也許這就是您需要的內容 –

+0

@SamSwift웃 :請不要鏈接到完全過時的版本。使用'current'代替鏈接中的版本號 –

回答

1

你不能用靜態SQL做你想做的事情,你需要動態SQL來做到這一點。

最簡單的方法就是把這個變成一個功能:

create or replace function get_rowcounts(p_schema text) 
    returns table (table_name text, row_count bigint) 
as 
$$ 
declare 
    name_rec record; 
begin 

    for name_rec in select t.table_name 
        from information_schema.tables t 
        where t.table_schema = p_schema 
    loop 
    return query execute format('select %L::text, count(*) from only %I.%I', name_rec.table_name, p_schema, name_rec.table_name); 
    end loop; 
end; 
$$ 
language plpgsql; 

這可以通過以下方式來使用:

select * 
from get_rowcounts('public'); 
相關問題