Postgres的创建视图使用记录类型功能(Postgres Create View With Re

2019-10-17 17:45发布

我有一个用户定义的函数这个复杂的查询conta_relatos()运行得很好,select语句。 但是,当我尝试创建一个具有相同指令的观点是行不通的。 Postgres的告诉我,列“conta_relatos”有伪类型的记录。 此功能, conta_relatos()返回一个记录类型的变量。
除了通过编辑:
返回类型是如在前面的问题限定的公知的复合类型:
Postgres的函数结束循环,并返回错误

下面是查询:

CREATE OR REPLACE VIEW "Sumario" AS 
SELECT "Aspectos"."ID" AS "Aspecto Normativo ID", 
    "Aspectos"."Aspecto" AS "Aspecto Normativo", 
    "Fatores"."ID" AS "Fator Normativo ID", 
    "Fatores"."Fator" AS "Fator Normativo", "Diagnostico"."Vinculo_Final", 
    "Fatores_1"."ID" AS "Fator Determinativo ID", 
    "Fatores_1"."Fator" AS "Fator Determinativo", 
    "Aspectos_1"."ID" AS "Aspecto Determinativo ID", 
    "Aspectos_1"."Aspecto" AS "Aspecto Determinativo", 
    count("Itens"."ID") AS "No Itens", 
    conta_relatos("Fatores"."ID", "Fatores_1"."ID")
FROM  
    "Diagnostico"
JOIN ("Aspectos" "Aspectos_1"
JOIN ("Fontes"
JOIN "Itens" ON "Fontes"."ID" = "Itens"."Fonte"
JOIN ("Fatores" "Fatores_1"
JOIN ("Aspectos"
JOIN ("Vinculos"
JOIN "Fatores" ON "Vinculos"."Fator_Normativo" = "Fatores"."ID") ON "Aspectos"."ID" = "Fatores"."Aspecto" AND "Aspectos"."ID" = "Fatores"."Aspecto") ON "Fatores_1"."ID" = "Vinculos"."Fator_Determinativo") ON "Itens"."ID" = "Vinculos"."Item") ON "Aspectos_1"."ID" = "Fatores_1"."Aspecto") ON "Diagnostico"."ID" = "Vinculos"."Diagnostico_ID"
GROUP BY "Aspectos"."ID", "Aspectos"."Aspecto", "Fatores"."ID", "Fatores"."Fator", "Diagnostico"."Vinculo_Final", "Fatores_1"."ID", "Fatores_1"."Fator", "Aspectos_1"."ID", "Aspectos_1"."Aspecto"
ORDER BY "Aspectos"."ID", "Aspectos_1"."ID", "Fatores"."Fator", "Fatores_1"."Fator";

Answer 1:

在仔细检查:您只需要拆分复合返回类型是这样的:

CREATE OR REPLACE VIEW "Sumario" AS 
SELECT ...
 (conta_relatos("Fatores"."ID", "Fatores_1"."ID")).*
FROM ...

关于在手册中访问复合类型的信息。

顺便说一句:我会建议不要使用括号为您的JOIN,除非你知道自己在做什么。 你有它的样子,你正在迫使一个特定的执行计划。 机会是,它不是最好的之一。


第一种方法曲解了错误信息

当你定义一个函数RETURNS record (我避免在可能的情况),你必须提供一个字段定义列表与每一个电话,如:

SELECT * FROM conta_relatos(1,2) AS f(col1 int, col2 text, ...)

我引用这里的手动 :

如果该函数被定义为返回的记录数据类型,然后别名或关键字AS必须存在,随后在形式的字段定义列表(列DATA_TYPE [,...])。 列定义列表必须由该函数返回列的实际数量和类型相匹配。

干净的解决办法是改变你的函数,而不是返回一个众所周知的类型匿名纪录。 有多种方法去了解的是,视情况而定。 如果你有麻烦在重写功能,打开另外一个问题。



文章来源: Postgres Create View With Record Type Function