【问题标题】:Crosstab query with CTE returns error: relation "cte" does not exist带有 CTE 的交叉表查询返回错误:关系“cte”不存在
【发布时间】:2021-05-09 10:46:44
【问题描述】:

我的 PostgreSQL 服务器上有两个架构,我正在尝试创建一个透视表:

WITH cte AS (
   SELECT l.fcid, t.fixture_code, COUNT(f.fixture_type_id) AS count  
        FROM aim.locations as l
            JOIN aim.fixture_instances as f
            ON l.id = f.location_id
            JOIN aim.fixture_types as t
            ON f.fixture_type_id = t.id
   GROUP BY l.fcid, t.fixture_code
   )
SELECT *
FROM lab.CROSSTAB('SELECT fcid, fixture_code, SUM(count) FROM cte group by 1,2 order by 1,2', 
                   'Select DISTINCT fixture_code from cte order by 1') 
                AS CT (FCID integer, "fx1" bigint, "fx2" bigint)
ORDER BY fcid;

但是,我收到一个错误:

ERROR:  relation "cte" does not exist
LINE 1: Select DISTINCT fixture_code from cte order by 1

当我只有一个架构时,查询有效。
我使用 CTE,因此可以使用查询创建视图。
这里有什么问题?

【问题讨论】:

  • 如果您想在这些查询中访问它,请将 CTE 定义放在传递给函数的查询之前。
  • @stickybit 不确定你的意思。是不是已经像你描述的那样了。可以展示吗?谢谢!
  • 不,不是我描述的那样。将 CTE 放入 crosstab() 的参数 not 选择 from crosstab() -- ... crosstab('WITH ... SELECT ...', 'WITH ... SELECT ...', ... 的查询
  • 哦,我明白了。十分感谢! @sticky 位

标签: sql postgresql common-table-expression crosstab


【解决方案1】:

实际上,您根本不需要查询字符串参数的外部SELECT。添加的sum(count) 不会改变这个星座。 CTE 中的查询已经将最终结果提供给crosstab()。完全摆脱 CTE - 从而也解决了错误的直接原因:

SELECT *
FROM   lab.crosstab(
         $$
         SELECT l.fcid, t.fixture_code, count(*) AS cnt
         FROM   aim.locations         l
         JOIN   aim.fixture_instances f ON l.id = f.location_id
         JOIN   aim.fixture_types     t ON f.fixture_type_id = t.id
         GROUP  BY 1,2
         ORDER  BY 1,2
         $$
      ,  $$VALUES ('fx1'), ('fx2')$$
       ) AS ct(fcid int, fx1 bigint, fx2 bigint);

其他一些事情:

当您必须在列定义列表中拼出相应的列名时,运行SELECT DISTINCT 毫无意义。将其替换为普通的 VALUES 表达式。

f.fixture_type_id 根据查询的定义是NOT NULL,所以使用更快的等效count(*)

这里的基本信息:

【讨论】:

    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多