Нужно решение для вывода матрицы сложных запросов в mariadb
create table role (
role varchar(20),
id int
);
insert into role (role, id) values ('Friend', 1);
insert into role (role, id) values ('Son', 2);
insert into role (role, id) values ('Daughter', 3);
insert into role (role, id) values ('Father', 4);
insert into role (role, id) values ('Mother', 5);
insert into role (role, id) values ('Brother', 6);
insert into role (role, id) values ('Sister', 7);
create table person (
persons varchar(20),
personid int
);
insert into person (persons, personid) values ('James', 1);
insert into person (persons, personid) values ('Peter', 2);
insert into person (persons, personid) values ('Joseph', 3);
insert into person (persons, personid) values ('Jeni', 4);
create table role_person (
roleid int,
personid int
);
insert into role_person (roleid, personid) values (2, 1);
insert into role_person (roleid, personid) values (2, 2);
insert into role_person (roleid, personid) values (4, 2);
insert into role_person (roleid, personid) values (6, 2);
insert into role_person (roleid, personid) values (6, 2);
insert into role_person (roleid, personid) values (3, 4);
insert into role_person (roleid, personid) values (4, 3);
Я хочу, чтобы окончательный вывод был следующим
окончательный вывод
человек друг сын дочь отец мать брат сестра Джеймс - Y - - - - - Питер - Y - Y - Y - Джозеф - - - Y - - - Джени - - Y - - - -
Поскольку основной базой данных является Maria DB, я не могу использовать функцию pivot. Обратите внимание, что люди могут увеличиваться или уменьшаться / также, роль может возрасти завтра, как дедушка, жена и т. Д
Не уверен, как решить эту проблему в хранимых процедурах или запросах.
Можем ли мы использовать тип данных XML для обработки динамического запроса.
3 ответа
Я решил это, используя временную таблицу, изменив временную для каждого поля и обновив с правильным параметром.
Я думаю, что пока невозможно получить динамическое количество столбцов в MariaDB.
Насколько я знаю, эта функция присутствует только в:
- Oracle (как "модель").
- PostgreSQL (как "кросс-таблица").
- SQL Server (как "свод").
Как насчет:
select
p.persons,
case when 1 in (select 1 from role_person rp where rp.personid = p.personid and rp.roleid = 1) then 'Y' else '-' end as friend,
case when 1 in (select 1 from role_person rp where rp.personid = p.personid and rp.roleid = 2) then 'Y' else '-' end as son,
case when 1 in (select 1 from role_person rp where rp.personid = p.personid and rp.roleid = 3) then 'Y' else '-' end as daughter,
case when 1 in (select 1 from role_person rp where rp.personid = p.personid and rp.roleid = 4) then 'Y' else '-' end as father,
case when 1 in (select 1 from role_person rp where rp.personid = p.personid and rp.roleid = 5) then 'Y' else '-' end as mother,
case when 1 in (select 1 from role_person rp where rp.personid = p.personid and rp.roleid = 6) then 'Y' else '-' end as brother,
case when 1 in (select 1 from role_person rp where rp.personid = p.personid and rp.roleid = 7) then 'Y' else '-' end as sister
from person p;
Результат:
persons friend son daughter father mother brother sister
James - Y - - - - -
Peter - Y - Y - Y -
Joseph - - - Y - - -
Jeni - - Y - - - -