Usuário com melhor resposta
SUB-SELECT

Pergunta
-
BOM DIA PESSOAL, ESTOU COM O SEGUINTE PROBLEMA:
_ EU TENHO UMA TABELA DE JORNAIS QUE TEM AS SEGUINTES COLUNAS:
CODIGO_JORNAL
INDICADOR_UTILIZACAO_TABELA_AUXILIAR_JORNAL
CODIGO_ESTADO
INDICADOR_UTILIZACAO_TABELA_AUXILIAR_ESTADO
E EU PRECISO RETORNAR OS SEGUINTES DADOS:
CODIGO_JORNAL
DESCRICAO_JORNAL
CODIGO_ESTADO
DESCRICAO_ESTADO
SÓ QUE FUNCIONA DA SEGUINTE MANEIRA:
SE INDICADOR_UTILIZACAO_TABELA_AUXILIAR_JORNAL = 0
EU PEGO A DESCRICAO DE JORNAL DA TABELA DOMINIO
SE INDICADOR_UTILIZACAO_TABELA_AUXILIAR_JORNAL = 1
EU PEGO A DESCRICAO DE JORNAL DA TABELA AUXILIAR DE JORNAL
O MESMO OCORRE PARA ESTADO:
SE INDICADOR_UTILIZACAO_TABELA_AUXILIAR_ESTADO = 0
EU PEGO A DESCRICAO DE ESTADO DA TABELA DOMINIO
SE INDICADOR_UTILIZACAO_TABELA_AUXILIAR_ESTADO = 1
EU PEGO A DESCRICAO DE JORNAL DA TABELA AUXILIAR DE ESTADO.
COMO FAÇO ISSO?
OBRIGADO!
Att. Thiago
Respostas
-
Thiago,
Apesar de não gostar de Query dinâmica.. acho que sua solução pode ser uma query dinâmica ou se usar left joins e uar o case p/ as colunas
Ex.
declare @jonal as table(cod int, descr varchar(40)) insert into @jonal values(1,'jornal teste') declare @jonaldominio as table(codjornal int, descr varchar(40)) insert into @jonaldominio values(1,'jornal teste dom') declare @jornalaux as table(codjornal int, descr varchar(40)) insert into @jornalaux values(1,'jornal teste aux') declare @IND_UTIL_AUX_JORNAL bit -- pegando do dominio set @IND_UTIL_AUX_JORNAL = 0 select a.*, case when @IND_UTIL_AUX_JORNAL=1 then c.descr else b.descr end as 'desc_aux' from @jonal a left join @jonaldominio b on a.cod = b.codjornal left join @jornalaux c on a.cod = c.codjornal -- pegando do auxiliar set @IND_UTIL_AUX_JORNAL = 1 select a.*, case when @IND_UTIL_AUX_JORNAL=1 then c.descr else b.descr end as 'desc_aux' from @jonal a left join @jonaldominio b on a.cod = b.codjornal left join @jornalaux c on a.cod = c.codjornal
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!- Marcado como Resposta Junior Galvão - MVPMVP, Moderator sexta-feira, 20 de fevereiro de 2015 14:40
Todas as Respostas
-
Thiago,
Apesar de não gostar de Query dinâmica.. acho que sua solução pode ser uma query dinâmica ou se usar left joins e uar o case p/ as colunas
Ex.
declare @jonal as table(cod int, descr varchar(40)) insert into @jonal values(1,'jornal teste') declare @jonaldominio as table(codjornal int, descr varchar(40)) insert into @jonaldominio values(1,'jornal teste dom') declare @jornalaux as table(codjornal int, descr varchar(40)) insert into @jornalaux values(1,'jornal teste aux') declare @IND_UTIL_AUX_JORNAL bit -- pegando do dominio set @IND_UTIL_AUX_JORNAL = 0 select a.*, case when @IND_UTIL_AUX_JORNAL=1 then c.descr else b.descr end as 'desc_aux' from @jonal a left join @jonaldominio b on a.cod = b.codjornal left join @jornalaux c on a.cod = c.codjornal -- pegando do auxiliar set @IND_UTIL_AUX_JORNAL = 1 select a.*, case when @IND_UTIL_AUX_JORNAL=1 then c.descr else b.descr end as 'desc_aux' from @jonal a left join @jonaldominio b on a.cod = b.codjornal left join @jornalaux c on a.cod = c.codjornal
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!!- Marcado como Resposta Junior Galvão - MVPMVP, Moderator sexta-feira, 20 de fevereiro de 2015 14:40
-
Cara, não consegui entender muito bem.
Eu havia feito um union q dependendo da condiçao tras a descricao do jornal de acordo com a tabela, so que acho q não consigo resolver esse problema para jornal e estado ao mesmo tempo com union.
Thks.
Att. Thiago -
Thiago,
a idéia do left funciona assim
ele traz os registros da tabela principal e com o case vc seleciona os registros das tabelas left, ou escreve uma query dinamica
declare @str varchar(max)
set @str='select * from tabela1'
if @parametro=1
set @str= @str + ' inner join tabela2'
else
set @str= @str + ' inner join tabela3'
end
exec (@str)
post o seu script que tento fazer as alteracoes nele.
att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!! -
SELECT
DetalheDominio.DESCRICAO AS NomeJornal,
Jornal.IND_UTIL_AUX_JORN AS IndicadorUtilizacaoAuxiliarJornal,
Jornal.COD_UF AS CodigoUnidadeFederativaJornal,
'' AS SiglaUnidadeFederativaJornal,
Jornal.IND_UTIL_AUX_UF AS IndicadorUtilizacaoAuxiliarUf
FROM
TABELA_JORNAL Jornal
INNER JOIN TABELA_DOMINIO Dominio ON
Jornal.COD_JORN = Dominio.COD_OPC_DOMI
INNER JOIN TABELA_DETALHE_DOMINIO DetalheDominio ON
Dominio.COD_TAB_DOMI = DetalheDominio.COD_TAB_DOMI AND
Dominio.NUM_VERS_DOMI = DetalheDominio.NUM_VERS_DOMI AND
Dominio.COD_OPC_DOMI = DetalheDominio.COD_OPC_DOMI
WHERE
Jornal.IND_UTIL_AUX_JORN = 0
UNION ALL
SELECT
AuxiliarJornal.NOME_JORN AS NomeJornal,
Jornal.IND_UTIL_AUX_JORN AS IndicadorUtilizacaoAuxiliarJornal,
Jornal.COD_UF AS CodigoUnidadeFederativaJornal,
'' AS SiglaUnidadeFederativaJornal,
Jornal.IND_UTIL_AUX_UF AS IndicadorUtilizacaoAuxiliarUf
FROM
TABELA_JORNAL Jornal
INNER JOIN AUXILIAR_JORNAL AuxiliarJornal ON
Jornal.COD_JORN = AuxiliarJornal.COD_JORN
WHERE
Jornal.IND_UTIL_AUX_JORN = 1
Esse union all resolve meu caso de retorno dos nomes dos jornais, mais não no retorno do nome do jornal e a sigla do estado.
Thks.
Att. Thiago -
Thiago,
vc vai passar um parametro e de acordo com este parametro vc vai retornar ou um ou outro neh.. ow vc precisa dos dois resultados?
a ideia com os lefts é mais ou menos assim:
SELECT case when @parametro = 0 then DetalheDominio.DESCRICAO ELSE AuxiliarJornal.NOME_JORN END AS NomeJornal, Jornal.IND_UTIL_AUX_JORN AS IndicadorUtilizacaoAuxiliarJornal, Jornal.COD_UF AS CodigoUnidadeFederativaJornal, '' AS SiglaUnidadeFederativaJornal, Jornal.IND_UTIL_AUX_UF AS IndicadorUtilizacaoAuxiliarUf FROM TABELA_JORNAL Jornal LEFT JOIN TABELA_DOMINIO Dominio ON Jornal.COD_JORN = Dominio.COD_OPC_DOMI LEFT JOIN TABELA_DETALHE_DOMINIO DetalheDominio ON Dominio.COD_TAB_DOMI = DetalheDominio.COD_TAB_DOMI AND Dominio.NUM_VERS_DOMI = DetalheDominio.NUM_VERS_DOMI AND Dominio.COD_OPC_DOMI = DetalheDominio.COD_OPC_DOMI LEFT JOIN AUXILIAR_JORNAL AuxiliarJornal ON Jornal.COD_JORN = AuxiliarJornal.COD_JORN
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!! -
Entao cara, deixa eu te explicar d outra forma.
A tabela de Jornais é simplesmente uma tabela de relacionamento.
Q tipo tem o Codigo do Jornal e o Codigo do Estado.
A unica diferença é que ambos os códigos tem um indicador q indica se o jornal e/ou estado estão cadastrados na tabela de dominio ou na tabela auxiliar. Sacou?
Eu preciso por exemplo listar todos jornais e junto tem q vir Nome do Jornal e Estado que ele esta relacionado.
Thks.
Att. Thiago -