Créer une vue à partir d'une autre

L'auteur de ce sujet a trouvé une solution à son problème.
Staff
Auteur du sujet

Salut,

En postgreSQL, j'ai une table my_table :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
DROP SCHEMA IF EXISTS roipoussiere cascade;
CREATE SCHEMA roipoussiere;

CREATE TABLE roipoussiere.my_table (
  id SERIAL PRIMARY KEY,
  x smallint,
  y smallint);

INSERT INTO roipoussiere.my_table(x, y) VALUES (42, 42);
-- [etc.]

… à partir de laquelle je crée les vues view_a et view_b, qui on toutes les 2 les mêmes colonnes (mais pas le même contenu) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
DROP VIEW IF EXISTS roipoussiere.view_a CASCADE;
CREATE VIEW roipoussiere.view_a AS SELECT
  'view_a_' || x || '_' || y AS foo,
  'Hello' AS bar,
  x,
  y
FROM roipoussiere.my_table;

DROP VIEW IF EXISTS roipoussiere.view_b CASCADE;
CREATE VIEW roipoussiere.view_b AS SELECT
  'view_b_' || '_' || x || '_' || y AS foo,
  'Hello' AS bar,
  x,
  y
FROM roipoussiere.my_table;

… pour enfin créer une vue my_vue, union de view_a et view_b :

1
2
3
4
DROP VIEW IF EXISTS roipoussiere.my_view CASCADE;
CREATE VIEW roipoussiere.my_view AS
  SELECT * FROM roipoussiere.view_a UNION ALL
  SELECT * FROM roipoussiere.view_b;

Mais view_a et view_b ressemblent beaucoup, il y a juste quelques colonnes qui diffèrent. Donc j'aimerais éviter de recopier bêtement la création des vues comme je fais ici, mais plutôt créer view_a, et ensuite créer view_b à partir de celle-ci (donc sans recopier la colonne bar, qui est identique pour les 2).

Note : Là c'est bien sur ultra-simplifié, en pratique :

  • il y a 4 vues, pas 2 ;
  • il y a quelques autres colonnes du type foo ;
  • il y a des dizaines d'autres colonnes du type bar (avec des données en dur) dans chaque vue ;
  • ma_vue va ensuite dans une appli qui accepte uniquement les tables / vues contenant des colonnes bien définies (c'est pour ça que j'ai des données en dur dans mes vues).

Édité par Roipoussiere

Cette année, venez nombreux au Capitole Du Libre à Toulouse, ce sera l'occasion de se rencontrer IRL ! :-)

+0 -0
Staff
Auteur du sujet

Du coup j'ai trouvé, ça se fait avec des CTE (Common Table Expression) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
CREATE VIEW roipoussiere.my_view as
WITH cte AS
(
    SELECT
      'Hello' AS bar,
      x,
      y
    FROM roipoussiere.my_table
)
SELECT
  concat_ws('_', 'view_a', x, y) AS foo,
  bar, x, y
FROM cte
UNION ALL
SELECT
  concat_ws('_', 'view_b', x, y) AS foo,
  bar, x, y
FROM cte

Cette réponse m'a aidée

Édité par Roipoussiere

Cette année, venez nombreux au Capitole Du Libre à Toulouse, ce sera l'occasion de se rencontrer IRL ! :-)

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte