Usuário com melhor resposta
Verificar LIKE entre tabelas

Pergunta
-
Bom dia,
Já há uns dias quebro a cabeça com tal solução e não encontro caminho para tal.
Tenho duas Tabelas: Munic e MunicAll
Em Munic há 300 registros, em MunicAll 4000
Em ambas existe o campo Nome_munic (o qual imagino um LIKE através de um while ou algo assim)
Gostaria de selecionar, os 300 registros de forma a percorrer a tabela MunicAll e verificar nomes parecidos.
O Output que imagino ideal seria pivotando os dados:
Munic | Possibilidade1 | Possibilidade2 | Possibilidade3 | Possibilidade4 | Possibilidade5Alguém já teve a necessidade de tratar dados dessa maneira!?
Se houver algum caso, por favor dê-me uma luz!
Abraços
DBA Vini
- Editado Vinicius Allil segunda-feira, 23 de abril de 2012 15:03 Faltam info.
Respostas
-
Vinicius,
Já tive uma necessidade similar, mas não utilizei o Like não, utilizei o operador Exists!
A sobrecarga de processamento gerada pelo Like é muito grande em uma única table, fazendo uso em junção de tabelas ou até mesmo com base uma subquery o tempo de processamento é significante.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 26 de abril de 2012 13:37
- Marcado como Resposta Vinicius Allil quinta-feira, 21 de junho de 2012 13:35
-
Vinicius
veja este exemplo...
-
declare @munic as table (nome varchar(20)) insert into @munic values ('São Paulo'),('Rio de Janeiro'),('Águas de Lindóia'),('Águas Claras') declare @MunicAll as table (nome varchar(20)) insert into @MunicAll values ('SAO PAUL'),('Sao Paaul'),('RIO DE JANEIRO'),('AGUA DE'),('AguA Clar'),('Agua de Agua') ;with cte_dados as ( select a.nome, b.nome as 'nmSoundex',DIFFERENCE(a.nome,b.nome) as diff, row_number() over (partition by a.nome order by a.nome) number from @munic a inner join @MunicAll b on DIFFERENCE(a.nome,b.nome) >=3 and LEFT(soundex(a.nome),1) = LEFT(soundex(b.nome),1) ) SELECT nome, [1], [2], [3] FROM (SELECT nome, nmSoundex, diff, number FROM cte_dados) AS SourceTable PIVOT ( max(nmSoundex) FOR number IN ([1], [2], [3]) ) AS PivotTable;
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 26 de abril de 2012 13:37
- Marcado como Resposta Vinicius Allil quinta-feira, 21 de junho de 2012 13:35
Todas as Respostas
-
-
Vinicius
Tenho uma ideia.. só posta um exemplo de dados das duas tabelas e como vc deseja o resultado para saber se é o que estou pensando...
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba -
OK, ai vai...
Munic MunicAll
São Paulo SAO PAUL
Sao Paaul
Rio de Janeiro RIO DE JANEIRO
Águas de Lindóia AGUA DE
Águas Claras AguA Clar
Agua de Agua
Resultado:
Nome_Munic Possib1 Possib2 Possib3
São Paulo SAO PAUL Sao Paaul
Rio De Janeiro RIO DE JANEIRO
Águas de Lindoia AGUA DE AguA Clar Agua de Agua
Águas Claras AGUA DE AguA Clar Agua de Agua
Um like como se fosse nos primeiros 4 caracteres, e depois pivotar tudo o que tem parecido...
ps: Não foi a tabela =S
DBA Vini
- Editado Vinicius Allil segunda-feira, 23 de abril de 2012 18:35 Erro na formatação
-
Vinicius,
Já tive uma necessidade similar, mas não utilizei o Like não, utilizei o operador Exists!
A sobrecarga de processamento gerada pelo Like é muito grande em uma única table, fazendo uso em junção de tabelas ou até mesmo com base uma subquery o tempo de processamento é significante.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 26 de abril de 2012 13:37
- Marcado como Resposta Vinicius Allil quinta-feira, 21 de junho de 2012 13:35
-
Vinicius
veja este exemplo...
-
declare @munic as table (nome varchar(20)) insert into @munic values ('São Paulo'),('Rio de Janeiro'),('Águas de Lindóia'),('Águas Claras') declare @MunicAll as table (nome varchar(20)) insert into @MunicAll values ('SAO PAUL'),('Sao Paaul'),('RIO DE JANEIRO'),('AGUA DE'),('AguA Clar'),('Agua de Agua') ;with cte_dados as ( select a.nome, b.nome as 'nmSoundex',DIFFERENCE(a.nome,b.nome) as diff, row_number() over (partition by a.nome order by a.nome) number from @munic a inner join @MunicAll b on DIFFERENCE(a.nome,b.nome) >=3 and LEFT(soundex(a.nome),1) = LEFT(soundex(b.nome),1) ) SELECT nome, [1], [2], [3] FROM (SELECT nome, nmSoundex, diff, number FROM cte_dados) AS SourceTable PIVOT ( max(nmSoundex) FOR number IN ([1], [2], [3]) ) AS PivotTable;
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 26 de abril de 2012 13:37
- Marcado como Resposta Vinicius Allil quinta-feira, 21 de junho de 2012 13:35