Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 连接两个表中矩阵的字符串_Sql_Postgresql_Many To Many_Pivot_Crosstab - Fatal编程技术网

Sql 连接两个表中矩阵的字符串

Sql 连接两个表中矩阵的字符串,sql,postgresql,many-to-many,pivot,crosstab,Sql,Postgresql,Many To Many,Pivot,Crosstab,我的PostgreSQL数据库中有3个表,实现了多对多关系:droit、role和role\u droit。请参阅附图中的图表。我使用此查询返回当前结果(也在图像中): 我想在droit和role的交叉处显示id\u droit、id\u role和haspair的串联!所需结果也在图像中: SELECT matrix_view.droit_id, sum(case when matrix_view.aid = 1 then haspair end) as "role A" ,

我的PostgreSQL数据库中有3个表,实现了多对多关系:
droit
role
role\u droit
。请参阅附图中的图表。我使用此查询返回当前结果(也在图像中):

我想在
droit
role
的交叉处显示
id\u droit
id\u role
haspair
的串联!所需结果也在图像中:

SELECT matrix_view.droit_id,
    sum(case when matrix_view.aid = 1 then haspair end) as  "role A" ,
    sum(case when matrix_view.aid = 2 then haspair end) as  "role B" ,
    sum(case when matrix_view.aid = 3 then haspair end) as  "role C" ,
    sum(case when matrix_view.aid = 4 then haspair end) as  "role D"
from (
        SELECT allRD.aid as aid, allRD.droit_id, max(case when RD.role_id is not null then 1 else 0 end) as HasPair
        from (
                select distinct a.role_id as aid, b.droit_id as droit_id
                from role a cross join droit b 
             ) as allRD 
        left outer join role_Droit RD
        on allRD.aid = RD.role_id and allRD.droit_id = RD.droit_id
        group by  allRD.droit_id,  allRD.aid
        order by  allRD.aid
    ) AS matrix_view
group by matrix_view.droit_id
order by matrix_view.droit_id

注意:在查询中,角色(
“角色A”、“角色B”、“角色C”、“角色D”)使用固定数字,我也使用了它们

请尝试以下查询:

SELECT cast(matrix_view.droit_name as text),
    matrix_view.droit_id || ',' || sum(case when matrix_view.aid = 1 then matrix_view.aid end) || ',' || sum(case when matrix_view.aid = 1 then haspair end) as  "role A" ,
    matrix_view.droit_id || ',' || sum(case when matrix_view.aid = 2 then matrix_view.aid end) || ',' || sum(case when matrix_view.aid = 2 then haspair end) as  "role B" ,
    matrix_view.droit_id || ',' || sum(case when matrix_view.aid = 3 then matrix_view.aid end) || ',' || sum(case when matrix_view.aid = 3 then haspair end) as  "role C" ,
    matrix_view.droit_id || ',' || sum(case when matrix_view.aid = 4 then matrix_view.aid end) || ',' || sum(case when matrix_view.aid = 4 then haspair end) as  "role D"

from (
        SELECT allRD.aid as aid, allRD.droit_id,allRD.droit_name , max(case when RD.role_id is not null then 1 else 0 end) as HasPair
        from (
                select distinct a.role_id as aid, b.droit_id as droit_id , b.droit_name as droit_name
                from role a cross join droit b 
             ) as allRD 
        left outer join role_Droit RD
        on allRD.aid = RD.role_id and allRD.droit_id = RD.droit_id
        group by  allRD.droit_id,  allRD.aid ,allRD.droit_name
        order by  allRD.aid
    ) AS matrix_view
group by matrix_view.droit_id, matrix_view.droit_name
order by matrix_view.droit_id

通常,轴心/交叉表问题。但是,由于您需要一小部分给定角色的结果,我们可以采取一种快捷方式:

SELECT droit_name
     , droit_id || ',1,' || EXISTS (SELECT FROM role_droit WHERE droit_id = d.droit_id AND role_id = 1)::int AS "role A"
     , droit_id || ',2,' || EXISTS (SELECT FROM role_droit WHERE droit_id = d.droit_id AND role_id = 2)::int AS "role B"
     , droit_id || ',3,' || EXISTS (SELECT FROM role_droit WHERE droit_id = d.droit_id AND role_id = 3)::int AS "role C"
     , droit_id || ',4,' || EXISTS (SELECT FROM role_droit WHERE droit_id = d.droit_id AND role_id = 4)::int AS "role D"
FROM   droit d
ORDER  BY droit_id;
精确地产生您想要的结果

我手动提供了角色名和ID,因为您只需要给定角色的结果,并且无论如何在SQL中都不能动态更改列的数量和名称


dbfiddle

供将来参考:我们更喜欢文本数据而不是图像数据。无法复制/粘贴图像以运行测试。。。请随时披露你的博士后版本。