4

在我的项目中,数据模型发生了变化,我必须发出一个新请求来获取信息,但过去看起来所有数据都在同一行,但现在部分数据在另一个表中,它返回我的专栏。

所以我的请求返回:

http://www.hostingpics.net/viewer.php?id=724031request.jpg

我认为这很容易,但我并不真正了解该功能是如何crosstab工作的。我试过这个:

    SELECT *
    FROM crosstab(
      'SELECT c.cd_type as typcou, c.dt_envoi as dtenvcou, c.commentaire as comment, c.signataire as signur
           FROM comm.courrier c
           WHERE c.id_formalite=1
     order by 1,2',
    'select lf.valeur as valeur from formalite.ligne_formalite lf, formalite.formalite f where lf.fk_formalite=f.id AND lf.fk_formalite=1'
     )

AS c(typcou text, dtenvcou text, comment text, signataire text, valeur1 text, valeur2 text, valeur3 text);

然而,我得到了

ERREUR:无效的返回类型 État SQL:42601 详细信息:查询指定的返回元组有 7 列,但交叉表返回 5。

有人可以帮我找出问题所在吗?

4

3 回答 3

1

您没有在问题中提及该列formalite.libelle,这对于解决方案至关重要。

我建议JOIN对您的主要查询使用显式语法 - 通常更易于阅读和理解。

由于无论如何您都必须拼出列定义列表中的所有列,因此使用VALUES表达式比函数SELECT DISTINCT ...的第二个参数更有效crosstab()

SELECT *
FROM crosstab(
  'SELECT c.cd_type, c.dt_envoi, c.commentaire, c.signataire
        , r.libelle, lf.valeur
   FROM   comm.courrier             c
   JOIN   formalite.formalite       f  ON f.id  = c.id_formalite
   JOIN   formalite.ligne_formalite lf ON lf.fk_formalite = f.id
   JOIN   norme.rubrique            r  ON r.id = lf.id_rubrique 
   WHERE  c.id_formalite = 1
   ORDER  BY 1'

   ,$$VALUES ('codepost'::text), ('bureau'), ('date')$$
   )
AS (typcou char, dtenvcou text, comment text, signur text
  , codepost text, bureau text, date text);

这个密切相关的答案中有更多解释和链接。

另外:我不会date用作列名,它是 SQL 中的保留字和 PostgreSQL 中的类型名称。

于 2012-12-05T16:50:39.807 回答
0

我知道了 !:

SELECT *
FROM crosstab(
  'SELECT c.cd_type as typcou, c.dt_envoi as dtenvcou, c.commentaire as comment, c.signataire as signur, r.libelle, lf.valeur
       FROM comm.courrier c, formalite.ligne_formalite lf, formalite.formalite f, norme.rubrique r
       WHERE c.id_formalite=f.id AND lf.fk_formalite=f.id
       AND c.id_formalite=1 AND r.id = lf.id_rubrique ORDER BY 1',
       'SELECT DISTINCT libelle FROM norme.rubrique ORDER BY 1')
AS (typcou char, dtenvcou text, comment text, signur text, codepost text, bureau text, date text);
于 2012-12-05T15:17:22.603 回答
0

按优先顺序尝试一些开源 ETL 工作室:

  1. 人才
  2. pentaho
  3. 碧玉软件

特别是如果您必须经常为大量数据执行此操作,但我想知道,您真的应该使用 Postgresql 吗?如果您愿意,还可以使用这些工具从一台数据库服务器迁移到另一台服务器。

于 2012-12-05T15:19:36.250 回答