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

"Il faut commencer par du rêve. Et les choses deviennent réelles à un moment ou un autre." - Kenny Todd, directeur des opérations pour l’ISS.

+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

"Il faut commencer par du rêve. Et les choses deviennent réelles à un moment ou un autre." - Kenny Todd, directeur des opérations pour l’ISS.

+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