Самостоятельное присоединение в представлении PostgreSQL - PullRequest
1 голос
/ 20 мая 2010

Я пытаюсь создать представления, которые бы накапливали все необходимые данные из объединенных источников:

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

Например, это позволяет легко выбирать данные владельца:

SELECT
    id,
    name,
    (owner).id AS owner_id,
    (owner).name AS owner_name,
    ((owner).company).name AS owner_company
FROM
    dir
WHERE
    id = 7

Проблема в том, что мне нужно выполнить самообъединение с представлением dir (которое создается вью) для преобразования поля parent_id аналогичным образом. PostgreSQL, похоже, не нравится, он говорит, что relation "dir" does not exist.

Любые намеки?


Ответ на комментарий Марсело Кантоса:

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

Ответы [ 2 ]

3 голосов
/ 20 мая 2010

Вы не можете создать рекурсивное представление, но в последних postgres вы можете делать рекурсивные запросы: http://www.postgresql.org/docs/8.4/static/queries-with.html

0 голосов
/ 20 мая 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...