• 0
Sign in to follow this  
Steven Tyler

duvida cruel

Question

fala galera, blza? então to com uma query aki q vi na net, e n entendi muito bem ela. vejam:

2) buscar os nomes dos médicos que têm consulta marcada com todos os pacientes

select  m.nome

from Médicos m

where not exists (select *

                  from Pacientes p

                  where not exists (select *

                               from Consultas c

                               where p.codp = c.codp

                                and m.codm = c.codm))

* interpreta-se da seguinte forma: “buscar os nomes dos médicos tais que não existam pacientes que não tenham consultas marcadas com eles”

Simulação:

Médicos (codm) Pacientes (codp) Consultas (codm, codp)

1 1 1 1

2 2 1 4

3 3 2 1

4 4 2 2

2 3

2 4

* Para o médico 1: existem pacientes (2 e 3) que não têm consultas marcadas com este médico (1a subconsulta retorna não vazia)

* Para o médico 2: não existe paciente que não tenha consulta marcada com este médico (1a subconsulta retorna vazia) – Ele é buscado!

mesmo lendo essa explicaçao, eu entendo a logica doq é feito, porem não entendi como são os passos de cada not exists, um dentro do outro eu fiquei meio confuso, alguém poderia exclarecer o passo a passo dessa query ?

muito obrigado

Share this post


Link to post
Share on other sites

3 answers to this question

Recommended Posts

  • 0

Cara o SQL por si só já muito claro mas vamos tentar aclarar a situação:

select  m.nome
from Médicos m
O SELECT acima retorna o nome do médicos cadastrados na tabela Médicos
select  m.nome

from Médicos m

where not exists (select *

                  from Pacientes p

                  where not exists (select *

                               from Consultas c

                               where p.codp = c.codp

                                and m.codm = c.codm))
Como o SELECT acima serão retornados todos os médicos desde que eles possuam registros relacionados na tabela Consulta. Pose-se entender assim: "Traga dos os médicos da tabela Medico que possuem (exists) registros relacionados na tabela Consulta". E com é feita esta mágica? Através de join (relacionamento).
from Consultas c

[b]                               where p.codp = c.codp

                                and m.codm = c.codm)[/b]

Só mas uma obervação não utilzar acentuação nos nomes das tabelas. Sei que é permitido mas pode causar muito transtornos principalmente se fro para o ambiente *unix.

Share this post


Link to post
Share on other sites
  • 0

isso que você falou eu entendi.....so que você viu a descricao do problema? todos os medicos que tenham consultas com TODOS os cliente...

nessa explicacao que você deu você n explicou como é essa relacao de not exists um dentro do outro, se for por exemplo....um not exists, eu entendo, agora um dentro do outro me deixou bem confuso !

entendeu?

Share this post


Link to post
Share on other sites
  • 0

A lógica é a mesma:

Lista os medicos da tabela Médicos que tenha pacientes na tabela Pacientes e que possua registros na tabela Consultas.

Seria com aninhar comandos:

select len(rtrim(ltrim(@var)))
O SQL irá nos pacientes e verifica se existe uma registro relacionado e depois irá nas consultas recuperar o registro relacionado com o medico e o paciente. Isto acontece por causa do join:
where p.codp = c.codp
                  and m.codm = c.codm

você pode ter vário exists aninhados com você tb poderá ter várias subquery aninhadas.

Aclarou?

Acho dificil explicar por como disse o sql já bem claro na propria sintaxe.

você utiliza o query analyzer?

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this