none
Trazer os registros de uma tabela de acordo com o where de outra RRS feed

  • Pergunta

  • Boa noite,

    Sou novato na área de banco de dados e me deparei com uma situação que não sei como solucionar. Mesmo parecendo (pelo menos parece, rs) simples.

    Existe uma tabela chamada "dbo.FISICA" e outra chamada "dbo.MATRICULA", na tabela "dbo.FISICA" ficam todos os "clientes" do sistema, que possuam matrícula ou não, e na tabela "dbo.MATRICULA" ficam as matriculas destes clientes, cada cliente pode possuir uma ou mais matrículas, assim:

    TABELA dbo.FISICA:

    CODIGO  NOME   SEXO   DATANASC   CPF   

    ---------  -------  -------  -------------  --------------------

    1           Otavio   M         22/05/1994  111.111.111-11

    2           Luis      M         21/04/1993   222.222.222-22

    TABELA dbo.MATRICULA

    CODIGO   FISICA   CURSO   STATUS

    ---------   --------   --------   ---------

    1             1             3          0 

    2             1             4          2 

    3             1             5          4

    4            2              3          0

     

    A minha intenção é fazer uma query que traga os alunas que possuem apenas matrícula com status 0, então neste caso na minha query deveria trazer apenas o Luis.

    Eis minha query:

    select
    F.NOME,
    M.STATUS

    from sophia.MATRICULA M

    Left join sophia.FISICA F on F.CODIGO = M.FISICA
    Left join sophia.TURMAS T on T.CODIGO = M.TURMA_REGULAR

    WHERE M.STATUS = 0

    E o resultado:

    NOME    STATUS

    -------   ------  

    Otavio   0

    Luis      0

    Pois obviamente ele me trouxe os alunos que possuem matrícula status 0, e não que só possuem.

    Agradeço desde já a atenção de todos! :)


    • Editado otaviinn quarta-feira, 6 de junho de 2018 22:44 melhora ortográfica
    quarta-feira, 6 de junho de 2018 22:42

Respostas

Todas as Respostas

  • otaviinn,

        Veja em "Usando COUNT com HAVING":

    ==================================
    COUNT (Transact-SQL)
    H. Usando COUNT com HAVING
    https://docs.microsoft.com/pt-br/sql/t-sql/functions/count-transact-sql?view=sql-server-2017

    ==================================

        Deve ser algo assim:

    select
    F.NOME,
    M.STATUS
    from sophia.MATRICULA M
    Left join sophia.FISICA F on F.CODIGO = M.FISICA
    Left join sophia.TURMAS T on T.CODIGO = M.TURMA_REGULAR
    WHERE M.STATUS = 0
    GROUP BY M.Codigo  
    HAVING COUNT(M.Codigo) = 1;  


    []'s,
    Fabio I.
    • Editado Fabio I quarta-feira, 6 de junho de 2018 22:53
    quarta-feira, 6 de junho de 2018 22:52
  • Boa noite Fabio, muito obrigado por sua resposta :)

    Neste caso ele me trouxe os alunos que possuem apenas uma matrícula, não necessáriamente apenas que possua matrícula com status 0. :(

    quarta-feira, 6 de junho de 2018 23:08
  • otaviinn,

       Vixe, não sou muito bom de SQL, mas tente retirar a cláusula WHERE e colocar dentro do HAVING COUNT o Status...

    select
    F.NOME,
    M.STATUS
    from sophia.MATRICULA M
    Left join sophia.FISICA F on F.CODIGO = M.FISICA
    Left join sophia.TURMAS T on T.CODIGO = M.TURMA_REGULAR
    GROUP BY M.Codigo  
    HAVING COUNT(M.Codigo) = 1 And M.STATUS = 0;  

    ===============================================
    SQL HAVING Clause
    https://www.w3schools.com/sql/sql_having.asp
    ===============================================

         Essa query abaixo...

    SELECT ProductID, Quantity
    FROM [OrderDetails]
    GROUP BY (ProductID) 
    HAVING COUNT(ProductID) = 1 And Quantity < 20
    ORDER BY ProductID;

       ... funcionou no simulador da w3schools:

    https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_having2

       Talvez a ordem do select precise ser diferente...

    []'s,
    Fabio I.

    • Editado Fabio I quarta-feira, 6 de junho de 2018 23:42
    quarta-feira, 6 de junho de 2018 23:22
  • Deleted
    quinta-feira, 7 de junho de 2018 00:08
  • Bom dia,

    otaviinn, segue outra sugestão para testes:

    select
        F.NOME,
        max(M.STATUS) as STATUS
    from MATRICULA M
    inner join FISICA F on F.CODIGO = M.FISICA
    group by
        F.NOME
    having
        min(M.STATUS) = 0 and
        max(M.STATUS) = 0
    

    Espero que ajude


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

    quinta-feira, 7 de junho de 2018 12:35
  • Boa tarde Galera,

    A questão foi resolvida com a seguinte query:

    SELECT F.nome, M.status FROM matricula M JOIN fisica F ON F.codigo = M.fisica WHERE (SELECT Count(*) FROM matricula WHERE fisica = F.codigo AND status <> 0) = 0

    Agradeço imensamente as respostas. 

    quinta-feira, 7 de junho de 2018 19:10
  • otaviinn,

       Não esqueça de fechar o tópico pontuando que deu a melhor resposta. Que no caso não fui eu... KKKKK!

    []'s,
    Fabio I.
    quinta-feira, 7 de junho de 2018 19:27
  • Boa tarde Galera,

    A questão foi resolvida com a seguinte query:

    SELECT F.nome, M.status FROM matricula M JOIN fisica F ON F.codigo = M.fisica WHERE (SELECT Count(*) FROM matricula WHERE fisica = F.codigo AND status <> 0) = 0

    Agradeço imensamente as respostas. 

    Otaviinn,

    Somente um detalhe troque o símbolo de * na função Count pela respectiva coluna que você deseja contar, desta forma, você vai evitar que o SQL Server tenha que percorrer todos as linhas e todas as colunas para estabelecer a contagem.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 8 de junho de 2018 18:28