Справка по SQL-запросам (Postgresql) - PullRequest
2 голосов
/ 28 июля 2011

У меня проблемы с тем, чтобы обернуть голову вокруг запроса. У меня есть следующие 3 таблицы:

documents (
    id,
    title
);

positions (
    id,
    title
);

documents_positions (
    document_id,
    position_id
);

То, что я пытаюсь получить (мой запрошенный результат), - это матрица документов, и к каким позициям они относятся. Таким образом, каждая строка будет иметь заголовок документа, а затем иметь столбец для каждой позиции и столбец рядом с ней с True или False, если позиции применяются к документу. Я подозреваю, что требуется какое-то LEFT JOIN, потому что в каждой строке после документа я хочу перечислить каждую позицию из таблицы позиций и определить, применяется ли к ней документ. Имеет смысл?

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Так как вы хотите превратить positions строки в столбцы, вы должны их "разворачивать".В PostgreSQL это делается с помощью функции crosstab .Однако, crosstab, по-видимому, требует, чтобы вы определили количество выходных столбцов в запросе, которое вы не можете сделать, так как количество строк в positions может быть изменено?Я сам не пользователь PostgreSQL, так что, возможно, есть какой-то трюк для создания динамического запроса, о котором я не знаю, но кажется, что проще использовать запрос, такой как опубликованный Andomar, а затем поворачивать строки в вашем клиентском коде ...

1 голос
/ 28 июля 2011

Вы можете использовать cross join для построения матрицы, а затем left join, чтобы найти позиции в матрице, которые заполнены:

select  d.title
,       p.title
,       case when dp.document_id is null then 'hrmm' else 'HALLELUJAH' end
from    documents d
cross join
        positions p
left join
        documents_positions dp
on      dp.document_id = d.id
        and dp.position_id = p.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...