none
SQL com filtro maluco RRS feed

  • Pergunta

  • PEssoal, estou com um problema bem chato, desde ontem tentando.

    Tenho uma tabela Chamada Pessoa (CPF, NOME_COMPLETO) 

    Outra tabela chamada Endereço: (CPF, CEP, CIDADE, LOGRADOURO, NÚMERO e TIPO_IMÓVEL).

    Na tabela pessoa, eu só tenho uma pessoa, porém, essa pessoa pode ter 'n' endereços na tabela 'endereço' (que pode ser o Tipo 1 e tipo 2)

    O problema é que preciso ter uma consulta que tenha o CPF (pessoas) e CEP, CIDADE (Endereço). Mas, como  na tabela endereços tem várias, não tem como retornar apenas um registro. 

    Com posso na consulta trazer um registro apenas da tabela endereço para cada pessoas?

    A regra é considerar se tem primeiro o do tipo 1, se não tiver, o primeiro registro que vier.

    Poderiam me ajudar?

    sexta-feira, 27 de fevereiro de 2015 19:20

Respostas

  • Boa tarde,

    Experimente mais ou menos dessa forma:

    select
        p.CPF,
        c.CEP,
        c.CIDADE
    from Pessoa as p
    cross apply
    (
        select top 1
            e.CEP,
            e.CIDADE
        from Endereco as e
        where
            e.CPF = p.CPF
        order by
            e.TIPO_IMOVEL
    ) as c

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 27 de fevereiro de 2015 19:43

  • A query do Cross Apply que sugeri está ordenando os endereços pelo valor da coluna TIPO_IMOVEL.

    Considerando que os valores possíveis para essa coluna sejam apenas 1 e 2, deveria ser retornado o endereço com o valor igual a 1 quando o mesmo existir.

    Se o critério está incompleto ou incorreto, acho melhor você postar mais detalhes sobre o critério que deve ser utilizado para adaptação do Order By.


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex sexta-feira, 27 de fevereiro de 2015 20:16
    • Sugerido como Resposta Eduardo.Romero segunda-feira, 2 de março de 2015 17:13
    • Marcado como Resposta Ricardo Barbosa Cortes segunda-feira, 2 de março de 2015 19:10
    sexta-feira, 27 de fevereiro de 2015 20:16

Todas as Respostas

  • Boa tarde,

    Experimente mais ou menos dessa forma:

    select
        p.CPF,
        c.CEP,
        c.CIDADE
    from Pessoa as p
    cross apply
    (
        select top 1
            e.CEP,
            e.CIDADE
        from Endereco as e
        where
            e.CPF = p.CPF
        order by
            e.TIPO_IMOVEL
    ) as c

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 27 de fevereiro de 2015 19:43
  • Me ajudou sim. Mas, ele só pega o primeiro endereço, não consegui que ele pegasse primeiro o do tipo 1 e se não tiver nenhum, pegar o primeiro.
    sexta-feira, 27 de fevereiro de 2015 19:57

  • A query do Cross Apply que sugeri está ordenando os endereços pelo valor da coluna TIPO_IMOVEL.

    Considerando que os valores possíveis para essa coluna sejam apenas 1 e 2, deveria ser retornado o endereço com o valor igual a 1 quando o mesmo existir.

    Se o critério está incompleto ou incorreto, acho melhor você postar mais detalhes sobre o critério que deve ser utilizado para adaptação do Order By.


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex sexta-feira, 27 de fevereiro de 2015 20:16
    • Sugerido como Resposta Eduardo.Romero segunda-feira, 2 de março de 2015 17:13
    • Marcado como Resposta Ricardo Barbosa Cortes segunda-feira, 2 de março de 2015 19:10
    sexta-feira, 27 de fevereiro de 2015 20:16
  • Resolveu sim,  e me deu uma boa visão sobre o Cross apply (Que eu não conhecia)!

    Abçs!

    terça-feira, 3 de março de 2015 13:15