错误:创建视图时多次指定列"id"



我写了这段代码,它工作了:

SELECT d1.*,d3.*
FROM bdir_programmation.d_program AS d1 
JOIN (
SELECT d_program.id,MAX(id_reg) AS maxv
FROM bdir_programmation.d_program
GROUP BY d_program.id) AS d2 ON d1.id=d2.id AND d1.id_reg=d2.maxv
JOIN bdir_programmation.d_infra_progra d3 ON d1.id=d3.id;

但是当我想创建一个视图时,我得到这个错误:

ERROR: column "id"指定一次以上

我试图重命名SELECT列表中的不同变量,如其他主题中所解释的,但在这种情况下,似乎没有以正确的方式制作。我对结构有一些困难,这对我来说是全新的。

d_programd_infra_progra都有一列id。这适用于查询,其中两个列可以具有相同的别名,但不适用于视图,其中列名必须是唯一的。

因为两列的值是相同的,所以只取其中一个。这要求您取消*,并枚举您需要的列,如果您愿意,可以为它们提供别名。

视图不能产生具有重复列名的派生表,就像Laurenz解释的那样。

可以在连接中使用USING子句来简化查询,以吞下重复的(相同的,因此无论如何都是噪音)列。

SELECT *
FROM   bdir_programmation.d_program d1 
JOIN  (
SELECT d.id, MAX(d.id_reg) AS id_reg  -- instead of maxv
FROM   bdir_programmation.d_program d
GROUP  BY 1
) d2 USING (id, id_reg)
JOIN   bdir_programmation.d_infra_progra d3 USING (id);

工作,除非有更多相同的名称。

:

  • 如何在连接两个表时删除一个连接键

但是,通常使用DISTINCT ON:

更简单、更便宜。
SELECT *
FROM  (
SELECT DISTINCT ON (id) *
FROM   bdir_programmation.d_program AS d1 
ORDER  BY d.id_reg DESC NULLS LAST
) d1
JOIN   bdir_programmation.d_infra_progra d3 USING (id);

:

  • 选择每个GROUP BY组的第一行?

排序顺序DESC NULLS LAST产生max()的等效物。看到:

  • 优化组最大查询

同样,USING子句吞下了id列的第二个相同的实例。

无论哪种方式,视图定义都将SELECT *转换为在创建时查询生成的列的迭代列表("早期绑定")。以后对基础表的添加将不会反映在视图中。