none
Subquery RRS feed

  • Pergunta

  • Tenho 2 tabelas:

    a) FUNCIONARIO
    FuncionarioId: 1
    Nome: Joao
    Dept: RH

    b) LIVROS
    LivroId: 1
    LivroNome: Livro A
    FuncionarioId: 1

    LivroId: 2
    LivroNome: Livro B
    FuncionarioId: 2

    LivroId: 3
    LivroNome: Livro C
    FuncionarioId: 1

    LivroId: 4
    LivroNome: Livro D
    FuncionarioId: 1


    Entao gostaria de fazer um SELECT que me retornasse os dados do funcionario juntamente com os livros que ele pegou.
    Ex:


    Opcao de retorno (1) - Retornando os livros por virgula
    FuncionarioId Nome Dept Livros
    1 Joao Rh Livro A, Livro C, Livro D


    Opcao de retorno (2) - Retornando valores duplicados
    FuncionarioId Nome Dept Livros
    1 Joao Rh Livro A
    1 Joao Rh Livro C
    1 Joao Rh Livro D

    Opcao de retorno (3) - Nao sei se eh possivel assim
    FuncionarioId Nome Dept Livros
    1 Joao Rh Livro A
    Livro C
    Livro D

    Qual seria a forma mais indicada e como seria o SQL para isso ?
    Obrigado e Abracos
    quarta-feira, 11 de agosto de 2021 00:18

Respostas

  • Bom dia,

    Acho que a forma vai depender de como vai ser tratado o resultado, mas a forma natural em SQL para esse tipo de caso é a 2:

    select
        f.FuncionarioId,
        f.Nome,
        f.Dept,
        l.LivroNome
    from Funcionarios as f
    inner join Livros as l 
        on l.FuncionarioId = f.FuncionarioId

    A partir do SQL Server 2017 está disponível a função String_Agg que permite obter o retorno 3 de forma bem simples (também é possível obter esse formato nas versões anteriores do SQL Server mas de forma mais complexa):

    select
        f.FuncionarioId,
        f.Nome,
        f.Dept,
        string_agg(l.LivroNome, ', ') as Livros
    from Funcionarios as f
    inner join Livros as l 
        on l.FuncionarioId = f.FuncionarioId
    group by
        f.FuncionarioId,
        f.Nome,
        f.Dept
    

    A forma da opção 3 é possível mas para nesse tipo de caso o mais indicado é utilizar SQL para obter o resultado no formato 2 e fazer o tratamento na aplicação/apresentação para obter o formato 3, pois em SQL fica bem mais complexo.

    Espero que ajude


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

    • Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 11 de agosto de 2021 23:08
    • Marcado como Resposta AGA Neto segunda-feira, 25 de outubro de 2021 17:52
    quarta-feira, 11 de agosto de 2021 12:45