none
Verificar LIKE entre tabelas RRS feed

  • 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 | Possibilidade5

    Algué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.
    segunda-feira, 23 de abril de 2012 15:01

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]

    terça-feira, 24 de abril de 2012 14: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

    terça-feira, 24 de abril de 2012 17:41

Todas as Respostas

  • Eu nao entendi ao certo o que vc quer mas, como vc fala de trabalhar com dado a dado ( linha a linha) vc pode tentar usar CURSOR.

    []s


    http://www.diaadiasql.com.br

    segunda-feira, 23 de abril de 2012 16:26
  • 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

    segunda-feira, 23 de abril de 2012 17:41
  • 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
    segunda-feira, 23 de abril de 2012 18:21
  • 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]

    terça-feira, 24 de abril de 2012 14: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

    terça-feira, 24 de abril de 2012 17:41