下面是我手动创建 mview 的代码,其中变量为 table_schema、table_name 和 [列列表]。
CREATE MATERIALIZED VIEW table_schema.table_name_bvw
AS
WITH t0_ AS
(SELECT [list of columns]
FROM
(SELECT [list of columns] , Row_number() over (PARTITION BY objectid ORDER BY gdb_from_date DESC) rn_
FROM table_schema.table_name
WHERE (gdb_branch_id = 0)) a
WHERE rn_ = 1
AND gdb_is_delete = 0 )
SELECT [list of columns]
FROM t0_
WITH DATA;
CREATE UNIQUE INDEX IF NOT EXISTS table_name_bvw_uuid
ON table_schema.table_name_bvw USING btree
(globalid COLLATE pg_catalog."default" ASC NULLS LAST)
TABLESPACE pg_default;
CREATE INDEX IF NOT EXISTS table_name_bvw_spat_idx
ON table_schema.table_name_bvw USING gist
(shape)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS table_schema.table_name_bvw
OWNER TO owner;
我尝试创建一个循环,但不确定如何从数据库中提取 3 个变量。我应该从中创建一个表并循环遍历吗?
SELECT table_catalog, table_schema, table_name, array_to_string(array_agg(column_name order by columns.ordinal_position),',') column_name
FROM information_schema.columns
WHERE table_schema <> 'pg_catalog' AND table_name NOT LIKE 'i%'
AND table_schema = 'fhl_dpw'
group by table_catalog,table_schema,table_name
;
如果 mview 已经存在,我也希望它跳过。
好吧,我想通了!将参数从表传递到 Create 函数并循环遍历所有记录。效果很好。
DO $$
DECLARE
mviews CURSOR FOR
SELECT tablebvw,column_name,tablen,bud,bspat FROM usa_master.fhltable;
currentrow record;
BEGIN
FOR currentrow in mviews
LOOP
EXECUTE
'CREATE MATERIALIZED VIEW IF NOT EXISTS ' || currentrow.tablebvw ||
' AS
WITH t0_ AS
(SELECT ' || currentrow.column_name || '
FROM
(SELECT ' || currentrow.column_name || ', Row_number() over (PARTITION BY objectid ORDER BY gdb_from_date DESC) rn_
FROM ' || currentrow.tablen || '
WHERE (gdb_branch_id = 0)) a
WHERE rn_ = 1
AND gdb_is_delete = 0 )
SELECT ' || currentrow.column_name || '
FROM t0_
WITH DATA;
CREATE UNIQUE INDEX IF NOT EXISTS ' || currentrow.bud ||
' ON ' || currentrow.tablebvw ||' USING btree
(globalid COLLATE pg_catalog."default" ASC NULLS LAST)
TABLESPACE pg_default;
CREATE INDEX IF NOT EXISTS ' || currentrow.bspat || '
ON ' || currentrow.tablebvw || ' USING gist
(shape)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS ' || currentrow.tablebvw || '
OWNER TO masterschema';
END LOOP;
END$$;
技巧是使用 currentrow 作为变量源。