两种不同的模式如何在PostgreSQL中维护顺序

suzh9iv8  于 2023-05-28  发布在  PostgreSQL
关注(0)|答案(2)|浏览(119)

我有个要求我需要从两个不同的模式中计算相同的表。所需的输出应该是这样的(参见屏幕截图here
| 图式|表名|计数|
| - -----|- -----|- -----|
| sch1|表1|一千|
| sch2|表1|五百|
| sch1|表2|三千|
| sch2|表2|一千|
这是从模式1和模式2中获取表的计数差。因此,我可以使用LAG()或LEAD函数以上述方式获得输出。请帮帮忙
我试过很多方法。但所有的结果我得到的相关组的使用只有这将不会保持预期的时尚。

n3h0vuf2

n3h0vuf21#

当表列表不能硬编码时(比如需要迭代information_schema.tables),必须使用动态SQL。对于每个表,必须生成一个查询,然后在第二步中执行。
您可以使用此函数生成并执行给定表的行计数:

CREATE OR REPLACE FUNCTION row_count(schema_name text, table_name text)
 RETURNS bigint LANGUAGE plpgsql
AS $function$
DECLARE
 cnt bigint;
BEGIN
   EXECUTE format('select count(*) from %I.%I',
              schema_name, table_name)
    INTO cnt;
   RETURN cnt;
END
$function$

然后在以下查询中使用它,以在单个结果集中获取多个模式中存在的同名表的所有行计数:

WITH list(s,t) as (select table_schema, table_name
  from information_schema.tables
  where table_type='BASE TABLE'
    and table_schema in ('schema1', 'schema2')
)
SELECT l1.s, l1.t, row_count(l1.s, l1.t)
  FROM list l1 JOIN list l2 ON l1.t=l2.t and l1.s<>l2.s;
bttbmeg0

bttbmeg02#

最直接的方法可能是创建4个子查询UNION ALL,每个子查询从4个表中检索计数。

SELECT 'sch1' AS schema, 'table1' AS tablename, COUNT(*) AS cnt FROM sch1.table1
UNION ALL
SELECT 'sch2',           'table1',              COUNT(*)        FROM sch2.table1
UNION ALL
SELECT 'sch1',           'table2',              COUNT(*)        FROM sch1.table2
UNION ALL
SELECT 'sch2',           'table2',              COUNT(*)        FROM sch2.table2

相关问题