Eu tenho uma tabela que possui mapeamentos provenientes de fontes diferentes (uma linha para cada fonte) para três tipos de identificadores diferentes (idtype1 a idtype3), com idtype1 tendo a prioridade mais alta e idtype3 a mais baixa. Preciso mesclar e consolidar todos os mapeamentos relacionados, para poder ter uma visão melhor das relações entre eles.
A tabela inicial de mapeamentos se parece com:
idtype1 | idtype2 | idtype3 |
---|---|---|
nulo | b | c |
nulo | nulo | c |
nulo | b | d |
um | nulo | d |
nulo | b | nulo |
x | b | nulo |
Agora, como todos os tipos de id estão de alguma forma ligados entre si, ou seja, c ligado a b que está ligado a d , que está novamente ligado a a , agora, como x está relacionado a b , todos estão essencialmente ligados entre si. Devo ser capaz de consolidar as informações no resultado abaixo:
idtype1 | idtype2 | idtype3 |
---|---|---|
um | b | c |
um | b | d |
x | b | c |
x | b | d |
Exemplo 2:
idtype1 | idtype2 | idtype3 |
---|---|---|
nulo | nulo | c |
nulo | b | c |
nulo | nulo | d |
um | nulo | d |
nulo | b | d |
nulo | nulo | e |
nulo | b | e |
nulo | b | nulo |
Eu deveria consolidar isso em:
idtype1 | idtype2 | idtype3 |
---|---|---|
um | b | c |
um | b | d |
um | b | e |
Alguém pode ajudar a criar uma lógica eficiente para isso?
EDITAR:
A tabela pode ter múltiplas combinações, ou seja, ambos os exemplos podem estar presentes ao mesmo tempo com valores diferentes.
CREATE TABLE mappings (idtype1 VARCHAR(10),idtype2 VARCHAR(10),idtype3 VARCHAR(10))
INSERT mappings
VALUES
(null,null,'c'),
(null,'b','c'),
(null,null,'d'),
('a',null,'d'),
(null,'b','d'),
(null,null,'e'),
(null,'b','e'),
(null,'b',null),
(null,'q','r'),
(null,null,'r'),
(null,'q','s'),
('p',null,'s'),
(null,'q',null),
('t','q',null)
A saída deve ser:
idtype1 | idtype2 | idtype3 |
---|---|---|
um | b | c |
um | b | d |
x | b | c |
x | b | d |
p | q | R |
p | q | é |
p | q | t |
Supondo ..
a->b->c
, ∪p->b->e
⇒ {a->b->e
,p->b->c
}... então o seguinte deve ser suficiente:
É um pouco confuso, mas aqui está um dbfiddle completo usando o exemplo do conjunto de dados "editar".
Primeiro, isole apenas os registros que comunicam um relacionamento (qualquer linha com 2 ou 3 não-
NULL
valores) desta forma . As linhas singleton podem comunicar a existência de uma entidade órfã, mas não fornecerão nenhuma informação de mapeamento relevante.Isolar apenas essas linhas nos dá.
A partir daí, infira relacionamentos ausentes. Como assumimos que existem apenas 3 níveis, os únicos relacionamentos possíveis para pular níveis são aqueles com o
1->3
rótulo. por exemploDepois de normalizar os relacionamentos E preencher todas as lacunas, você se une aos relacionamentos
1->2
&2->3
para obter o conjunto completo, conforme visto abaixo.Dada esta abordagem, assumimos a solução abaixo:
Onde as linhas vermelhas são inferidas.
Esta solução tem algumas questões e advertências em aberto.
p->a
relacionamento fosse introduzido, a transitividade se aplicaria de tal forma quea->q
agora fosse válida?p->a
⇒a->q
Um exemplo de auto-junção vs. recursão para inferir hierarquia pode ser lido mais detalhadamente em Find Ancestry From JSON
Se você estiver atrás de uma única consulta que produzirá o resultado esperado, provavelmente precisará fazer algo assim (que é essencialmente construir um conjunto de cada valor de "tipo" distinto e não nulo e, em seguida, gerar o interseção de cada um).
Você fala sobre os diferentes valores terem "links" entre si, o que, admito, para mim, não faz todo o sentido - mas, seguindo sua "saída esperada", presumo que sejam as combinações possíveis de cada tipo1 , type2, type3 valor que você deseja