SQL查询帮助(Postgresql)

SQL查询帮助(Postgresql),sql,postgresql,Sql,Postgresql,我在回答一个问题时遇到了麻烦。我有以下三个表格: documents ( id, title ); positions ( id, title ); documents_positions ( document_id, position_id ); 我想要得到的(我要求的结果)是一个文件矩阵,以及它们适用于哪些职位。因此,每一行都有文档标题,然后每个位置都有一列,如果位置应用于文档,则在其旁边有一列带有True或False。我怀疑需要某种左连

我在回答一个问题时遇到了麻烦。我有以下三个表格:

documents (
    id,
    title
);

positions (
    id,
    title
);

documents_positions (
    document_id,
    position_id
);

我想要得到的(我要求的结果)是一个文件矩阵,以及它们适用于哪些职位。因此,每一行都有文档标题,然后每个位置都有一列,如果位置应用于文档,则在其旁边有一列带有True或False。我怀疑需要某种左连接,因为在文档后的每一行上,我想列出positions表中的每个位置,以及文档是否应用于它。有意义吗?

您可以使用
交叉连接来构建矩阵,然后
左连接来查找矩阵中已填充的位置:

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

由于要将
位置
行转换为列,因此必须“旋转”它们。在PostgreSQL中,这是通过函数完成的。但是,
交叉表
似乎要求您在查询中定义无法执行的输出列数,因为
位置
中的行数可能会发生变化?
我自己不是PostgreSQL用户,所以可能有一些技巧可以构建动态查询,我不知道,但使用Andomar posted这样的查询似乎更容易,然后在客户端代码中旋转行…

您能提供输入数据和预期结果数据吗?这给了我正确的数据,但是,如果每个位置都与文档位于同一行,我怎么能让输出成为这样呢?@Pyrite:这就是所谓的“旋转”。Excel可以为您或大多数其他报告工具做到这一点。SQL不喜欢可变的列数,这使得纯SQL中几乎不可能进行数据透视。我想我的意思是,如何在Postgresql中透视结果?Postgresql中的数据透视似乎是手动定义SQL查询中的每个位置,但这不是一个选项,除非可以动态完成。所以我认为我应该在客户端应用程序中实现输出(在我的例子中,是一个使用PHP的HTML表)。所以问题仍然存在,我想怎么做。@Pyrite:
按p.id,d.id排序。然后为数据库中的每一行添加一个新列,并在位置每次更改时添加一个新行。