如何在视图中添加 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_dispatcher
和the_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:
新查询必须生成与 现有视图查询
所以DROP
和CREATE
视图:
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()?的主要内容,如果未能解决你的问题,请参考以下文章