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
Était-ce utile?

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
scroll top