Usuário com melhor resposta
Trazer os registros de uma tabela de acordo com o where de outra

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.STATUSfrom sophia.MATRICULA M
Left join sophia.FISICA F on F.CODIGO = M.FISICA
Left join sophia.TURMAS T on T.CODIGO = M.TURMA_REGULARWHERE 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
Respostas
-
-
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
- Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 8 de junho de 2018 18: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.
- Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 8 de junho de 2018 18:27
Todas as Respostas
-
otaviinn,
Veja em "Usando COUNT com HAVING":
==================================
COUNT (Transact-SQL)H. Usando COUNT com HAVINGhttps://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
-
-
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
-
-
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
- Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 8 de junho de 2018 18: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.
- Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 8 de junho de 2018 18: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]