Usuário com melhor resposta
Como relacionar dados de um campo formado por uma expressão CASE?

Pergunta
-
Boa tarde,
Estou com uma dificuldade em montar uma sentença SQL que envolve três tabelas pois um dos campos a ser relacionado é na verdade uma expressão CASE e não um campo comum da base.
As tabelas são: uhistorico (todas as disciplinas cursadas pelo aluno), uequivdisc (disciplina equivalente) e ugrade (grade curricular do aluno).
No Select abaixo, consigo obter o "cod_disciplina" através do case. Agora preciso relacionar esse "cod_disciplina" com a tabela ugrade (para saber quais disciplinas o aluno cursou e quais ele precisa cursar, ou seja, preciso relacionar com o Left Join.
O problema é que por ser uma expressão, não consigo fazer o relacionamento do cod_disciplina com a ugrade.codmat. Como posso fazer esse relacionamento?
select distinct
a.perletivo, a.mataluno, a.codcur, a.codper, a.grade, a.codmat, a.status, a.cargahoraria, b.codmateq,
case when b.codmateq is null then a.codmat else b.codmateq end as cod_disciplina
from uhistorico a left join uequivdisc b on a.codcur = b.codcureq and a.codper = b.codpereq and a.grade = b.gradeeq and a.codmat = b.codmat
where mataluno = 3112999Se puderem me ajudar, agradeço imensamente.
Respostas
-
Boa tarde Dilson,
Você usar essa mesma expressão case no seu inner/left join com a ugrade.
Ex:
.......
LEFT join ugrade u
on u.cdmat = (case when b.codmateq is null then a.codmat else b.codmateq end)At.
Rafael- Marcado como Resposta Heloisa Pires sexta-feira, 8 de junho de 2012 14:18
Todas as Respostas
-
Boa tarde Dilson,
Você usar essa mesma expressão case no seu inner/left join com a ugrade.
Ex:
.......
LEFT join ugrade u
on u.cdmat = (case when b.codmateq is null then a.codmat else b.codmateq end)At.
Rafael- Marcado como Resposta Heloisa Pires sexta-feira, 8 de junho de 2012 14:18
-
Sem problemas dilson,
podes comparar normalmente como o Rafael disse, mas nesse caso podes usar o ISNULL/COALESCE para tratar o campo no lugar do CASE.
Pode usar:
ISNULL(b.codmateq, a.codmat)
ou
COALESCE(b.codmateq, a.codmat)
Boa Sorte.
Antero Marques
- Sugerido como Resposta Rafael S. Melo terça-feira, 5 de junho de 2012 16:42
-
-
Olá Rafael, boa tarde!
Fiz conforme você sugeriu relacionando com a ugrade.codmat com o case... e deu certo! Tentei da forma explicada pelo Antero mas não compreendi muito bem aonde coloco a instrução ISNULL ou COALESCE.
Agradeço muito a colaboração de vocês.
Att.,
Dilson
-
Que bom que deu certo dilson, então marque a resposta do Rafael, por favor.
Explicando:
você substitui o
"case when b.codmateq is null then a.codmat else b.codmateq end as cod_disciplina"
por
ISNULL(b.codmateq, a.codmat) as cod_disciplina
e
u.cdmat = (case when b.codmateq is null then a.codmat else b.codmateq end)
por
u.cdmat = ISNULL(b.codmateq, a.codmat)
Antero Marques