none
SUB-SELECT RRS feed

  • 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
    segunda-feira, 17 de agosto de 2009 12:50

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!!!
    segunda-feira, 17 de agosto de 2009 13:17

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!!!
    segunda-feira, 17 de agosto de 2009 13:17
  • 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
    segunda-feira, 17 de agosto de 2009 13:52
  • 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!!!
    segunda-feira, 17 de agosto de 2009 14:24
  • 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
    segunda-feira, 17 de agosto de 2009 14:55
  • 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!!!
    segunda-feira, 17 de agosto de 2009 15:57
  • 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
    segunda-feira, 17 de agosto de 2009 18:01
  • Thiago,

    Se ela é uma tabela de relacionamento, como você esta relacionando?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 18 de agosto de 2009 02:47
    Moderador