如何在视图中添加 ROW_NUMBER()?

Posted

技术标签:

【中文标题】如何在视图中添加 ROW_NUMBER()?【英文标题】:How to add ROW_NUMBER() in a view? 【发布时间】:2013-01-01 20:56:58 【问题描述】:

在 PostgreSQL 8.4 中,我想从 3 个带有 id 的表创建一个视图。所以我想在我看来有这个结构:

num serial,
name_dispatcher character varying(250)
the_geom geometry

我可以从表格中选择name_dispatcherthe_geom

 CREATE VIEW lineView
      AS SELECT 'name' AS name_dispatcher, the_geom
      FROM line1
      UNION
      SELECT 'name' AS name_dispatcher, the_geom
      FROM line2
      UNION
      SELECT 'name' AS name_dispatcher, the_geom
      FROM line3

如何在视图中创建num列?

更新

我找到了解决办法:

ROW_NUMBER() OVER(ORDER BY lineView.voltage)

但我不知道如何在ALTER VIEW 中使用它。怎么放进去?

【问题讨论】:

旁注:请注意UNION 可能是一项昂贵的操作,因为它消除了重复。如果您知道最终结果中不会出现重复项,或者您可以接受存在的重复项,那么切换到 UNION ALL 可能会有所帮助。 【参考方案1】:

您不能使用ALTER VIEW 删除或添加列。我引用the manual on ALTER VIEW:

ALTER VIEW 更改视图的各种辅助属性。 (如果你 要修改视图的定义查询,请使用CREATE OR REPLACE VIEW。)

但是一个简单的CREATE OR REPLACE VIEW 并不能解决问题。 Another quote from the manual:

新查询必须生成与 现有视图查询

所以DROPCREATE 视图:

DROP VIEW lineview;

CREATE VIEW lineview AS
SELECT *, row_number() OVER(ORDER BY ???) AS num
FROM (
   SELECT 'name' AS name_dispatcher, the_geom
   FROM line1

   UNION
   SELECT 'name' AS name_dispatcher, the_geom
   FROM line2

   UNION
   SELECT 'name' AS name_dispatcher, the_geom
   FROM line3
   ) x

我使用子查询是因为我假设您想将row_number() 添加到所有行。您的问题在这方面含糊不清。 如果您只想要一个没有特定顺序的唯一 ID,请使用 row_number() OVER()

【讨论】:

@KliverMax:这是AS x 的缩写,是子选择的表别名。 SQL 需要一个。

以上是关于如何在视图中添加 ROW_NUMBER()?的主要内容,如果未能解决你的问题,请参考以下文章

INDEX 用于提高包含 ROW_NUMBER OVER PARTITION 的视图的性能

如何在 row_number() 列上应用转换

如何row_number()mysql中的排名数据集

mysql 怎么才能做到rownumber序号

如何在此查询中使用 ROW_NUMBER? [关闭]

ROW_NUMBER() ORDER BY,不能在同一个 SELECT 语句中使用列