Autojointure vue PostgreSQL
-
03-10-2019 - |
Question
Je suis en train de créer des vues qui accumulent toutes les données nécessaires à partir de sources jointes:
CREATE OR REPLACE VIEW dir AS
SELECT
dir_data.id,
dir_data.parent_id,
dir_data.name,
(owner.*)::owner, -- owner_id
FROM
dir_data
LEFT JOIN owner ON owner.id = dir_data.owner_id
Par exemple, cela permet de sélectionner les données de manière simple le propriétaire:
SELECT
id,
name,
(owner).id AS owner_id,
(owner).name AS owner_name,
((owner).company).name AS owner_company
FROM
dir
WHERE
id = 7
Le problème est que je dois faire une auto-jointure avec vue dir
(ce qui est le vew en cours de création) pour convertir champ parent_id
de manière similaire. PostgreSQL ne semble pas comme ça, il est dit que relation "dir" does not exist
.
Les conseils?
Réponse à Marcelo Cantos commentaire:
CREATE OR REPLACE VIEW dir AS
SELECT
...
FROM
dir_data
LEFT JOIN owner ON owner.id = dir_data.owner_id -- "standard" join
LEFT JOIN dir AS parent_dir ON parent_dir.id = dir_data.parent_id -- self-join, does not work
La solution
Vous ne pouvez pas créer une vue récursive, mais dans les derniers postgres, vous pouvez effectuer des requêtes récursives: http://www.postgresql.org/docs/8.4/static/queries-with.html
Autres conseils
WITH RECURSIVE dir AS
(
SELECT dir_data.id,
dir_data.parent_id,
dir_data.name,
owner
FROM dir_data
LEFT JOIN
owner
ON owner.id = dir_data.owner_id
WHERE dir_data.id = 7
UNION ALL
SELECT dir_data.id,
dir_data.parent_id,
dir_data.name,
owner
FROM dir
JOIN dir_data
ON dir_data.id = dir.parent_id
LEFT JOIN
owner
ON owner.id = dir_data.owner_id
)
SELECT *
FROM dir
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow