Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa Tarde.
Tem como eu fazer um CASE WHEN em um INNER JOIN ?
Por exemplo:
Na minha tabela tem dois campos FK. Um campo desses vai ser vazio a cada registro.
Supondo, tenho ID_Tabela_1 e ID_Tabela_2, as vezes um desses ficará com valor NULL.
E na hora de fazer o JOIN vai dar errado. Eu não posso fazer um LEFT JOIN, ou RIGHT JOIN devido a redundância de dados que vai ocorrer na consulta.
Então preciso fazer um:
SELECT
CAMPO1,
CAMPO2,
CAMPO3
FROM
TABELA
CASE
ID_TABELA 1 =
WHEN NULL THEN INNER JOIN TBL1.....
ELSE INNER JOIN TBL2.....
Mas não sei fazer.
Tem Como ou Jeito Melhor de Se Fazer Isso ?
Funcionou assim ?
Eu tentaria uma VIEW que fizesse um "union all" de tblcliente e tblplantacliente.
Não funcionou... achei que tinha funcionado.
Mas depois eu corrigi, veja;
select
statusos,
id_faturamento,
vlvenda,
id_vendaspot,
id_codcontrato,
tblcliente.codcli,
razaosocial,
tblplantacliente.codplanta,
descricao,
outrosvl,
vlbruto,
vl_liquido,
convert(varchar, dtprevfaturamento, 103) as dtprevf,
convert(varchar, dtinserido, 103) as dtinserido,
convert(varchar, dtfaturado, 103) as dtfaturado,
observacao,
tblfin_faturamento.status
from
tblfin_faturamento
left join
tblcomcontratos on tblcomcontratos.codcontrato = tblfin_faturamento.id_codcontrato
left join
tblcomvendas on tblcomvendas.codvenda = tblfin_faturamento.id_vendaspot
inner join
tblcliente
on
case
when tblfin_faturamento.id_codcontrato is null then tblcomvendas.codcliente
else tblcomcontratos.codcliente
end = tblcliente.codcli
inner join
tblplantacliente
on
case
when tblfin_faturamento.id_codcontrato is null then tblcomvendas.codplanta
else tblcomcontratos.codplanta
end = tblplantacliente.codplanta
Eu nunca usei o Union All.
Nao sei usar.
>
Eu nunca usei o Union All.
Nao sei usar.
aqui tem um exemplo de uso: http://forum.imasters.com.br/topic/224851-operador-union-e-union-all/
Tópico marcado como Resolvido.
Cade o Motta ?
select
statusos,
id_faturamento,
vlvenda,
id_codcontrato,
tblcomcontratos.codcliente,
razaosocial,
tblplantacliente.codplanta,
descricao,
outrosvl,
vlbruto,
vl_liquido,
convert(varchar, dtprevfaturamento, 103) as dtprevf,
convert(varchar, dtinserido, 103) as dtinserido,
convert(varchar, dtfaturado, 103) as dtfaturado,
observacao,
tblfin_faturamento.status
from
tblfin_faturamento
-- esse inner ******************************
inner join
tblcomcontratos on tblcomcontratos.codcontrato = tblfin_faturamento.id_codcontrato
inner join
tblcliente on tblcliente.codcli = tblcomcontratos.codcliente
-- esse inner ******************************
inner join
tblplantacliente on tblplantacliente.codplanta = tblcomcontratos.codplanta
Estão vendo onde eu marquei ? Então, preciso fazer um IF ou CASE ali. Caso o ID_CODCONTRATO seja Vazio, ele faça um outro INNER.
Resolvido
select
statusos,
id_faturamento,
vlvenda,
id_vendaspot,
id_codcontrato,
tblcliente.codcli,
razaosocial,
tblplantacliente.codplanta,
descricao,
outrosvl,
vlbruto,
vl_liquido,
convert(varchar, dtprevfaturamento, 103) as dtprevf,
convert(varchar, dtinserido, 103) as dtinserido,
convert(varchar, dtfaturado, 103) as dtfaturado,
observacao,
tblfin_faturamento.status
from
tblfin_faturamento
left join
tblcomcontratos on tblcomcontratos.codcontrato = tblfin_faturamento.id_codcontrato
left join
tblcomvendas on tblcomvendas.codvenda = tblfin_faturamento.id_vendaspot
inner join
tblcliente on
case
when tblcomcontratos.codcliente is null then tblcliente.codcli
else tblcomcontratos.codcliente
end = tblcomvendas.codcliente
inner join
tblplantacliente on
case
when tblcomcontratos.codplanta is null then tblplantacliente.codplanta
else tblcomcontratos.codplanta
end = tblcomvendas.codplanta