How to add ROW_NUMBER() in a view?

Kliver Max picture Kliver Max · Jan 18, 2013 · Viewed 29.1k times · Source

In PostgreSQL 8.4 I want to create a view from 3 tables with id. So I want to have this structure in my view:

num serial,
name_dispatcher character varying(250)
the_geom geometry

I can select name_dispatcher and the_geom from tables:

 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

How to create the num column in the view?

UPDATE

I found a solution:

ROW_NUMBER() OVER(ORDER BY lineView.voltage)

But I don't know how to use it in ALTER VIEW. How do I put it in there?

Answer

Erwin Brandstetter picture Erwin Brandstetter · Jan 18, 2013

You can't use ALTER VIEW to drop or add columns. I quote the manual on ALTER VIEW:

ALTER VIEW changes various auxiliary properties of a view. (If you want to modify the view's defining query, use CREATE OR REPLACE VIEW.)

But a simple CREATE OR REPLACE VIEW won't cut it. Another quote from the manual:

The new query must generate the same columns that were generated by the existing view query

So DROP and CREATE the view:

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

I use a subquery because I assume you want to add row_number() to all rows. Your question is vague in that respect.
If you just want a unique id in no particular order, use row_number() OVER().