我写了这段代码,它工作了:
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_program
和d_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 *
转换为在创建时查询生成的列的迭代列表("早期绑定")。以后对基础表的添加将不会反映在视图中。