none
View para quando não existe relacionamento entre as tabelas RRS feed

  • Pergunta

  • Eu tenho a seguinte view

    ALTER VIEW [dbo].[vw_RelInclusaoGeralCivil]
    AS
    SELECT   
    DISTINCT   
    	m.Nome AS MunicipioNome, 
    	au.Nome UsuarioNome,
            s.TipoId AS SolicitacaoTipoId
    FROM					
    	Solicitacao s
    INNER JOIN
    	Unidade u 
    ON
    	s.UnidadeEntregaId = u.Id
    INNER JOIN
    	Endereco e
    ON
    	u.EnderecoId = e.Id
    INNER JOIN
    	[IBGE.Municipio] m
    ON
    	e.CodMunicipio = m.CodMunicipio
    INNER JOIN
    	Terminal t
    ON
    	u.Id = t.UnidadeId
    INNER JOIN
    	Auditoria a
    ON
    	t.Id = a.TerminalId
    INNER JOIN
    	[Acesso.Usuario] au
    ON
    	a.UsuarioId = au.Id
    WHERE
    	s.TipoId <> 5
    AND
    	a.TerminalId IS NULL
    GO

    A tabela Solicitacao está assim:

    Id | UnidadeEntregaId | TipoId
    2  |        4         |   1

    A tabela Unidade assim:

    Id | EnderecoId | 
    4  |     5      |

    A tabela Endereco assim:

    Id | CodMunicipio | 
    5  |  5208707     |

    A IBGE.Municipio assim:

    CodMunicipio | Nome
    5208707      | GOIANIA

    O Terminal assim (não existe a UnidadeId = 4, mas eu preciso passar pelo Terminal para chegar no Acesso.Usuario):

    Id        | Codigo | 
    1         | 0001   |          

    A Auditoria assim(Todos os Terminais Id da Auditoria estão como null, mas eu também preciso dela para chegar no Acesso.Usuario):

    TerminalId | UsuarioId |
    NULL       |    31     |

    E a Acesso.Usuario assim:

    Id | Nome
    31 | Usuario Master

    Como faço para exibir a Solicitação na minha view?

    Obrigado


    quarta-feira, 4 de fevereiro de 2015 17:11

Respostas

  • Boa tarde Jean

    Você não está recebendo dados no retorno da sua view exatamente pelo ponto que destacou: "(não existe a UnidadeId = 4, mas eu preciso passar pelo Terminal para chegar no Acesso.Usuario):"

    Se não existe o dado e você está usando um INNER JOIN, não retornará.

    Se apenas a tabela Solicitação é mandatória altere seus joins para LEFT JOIN ao invés de INNER JOIN. 

    Dessa maneira os dados dessa tabela serão retornados, independente de existir correspondência com as demais tabelas.

    Abaixo segue o código alterado considerando que deve ser retornado os dados da tabela Solicitaçao mesmo que não existam correspondentes nas tabelas Terminal, Auditoria, Acesso.Usuario

    ALTER VIEW [dbo].[vw_RelInclusaoGeralCivil]
    AS
    SELECT   
    DISTINCT   
    	m.Nome AS MunicipioNome, 
    	au.Nome UsuarioNome,
            s.TipoId AS SolicitacaoTipoId
    FROM					
    	Solicitacao s
    INNER JOIN
    	Unidade u 
    ON
    	s.UnidadeEntregaId = u.Id
    INNER JOIN
    	Endereco e
    ON
    	u.EnderecoId = e.Id
    INNER JOIN
    	[IBGE.Municipio] m
    ON
    	e.CodMunicipio = m.CodMunicipio
    LEFT JOIN
    	Terminal t
    ON
    	u.Id = t.UnidadeId
    LEFT JOIN
    	Auditoria a
    ON
    	t.Id = a.TerminalId
    LEFT JOIN
    	[Acesso.Usuario] au
    ON
    	a.UsuarioId = au.Id
    WHERE
    	s.TipoId <> 5
    AND
    	a.TerminalId IS NULL
    GO

    Espero ter ajudado.


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */


    quarta-feira, 4 de fevereiro de 2015 19:15

Todas as Respostas

  • Boa tarde Jean

    Você não está recebendo dados no retorno da sua view exatamente pelo ponto que destacou: "(não existe a UnidadeId = 4, mas eu preciso passar pelo Terminal para chegar no Acesso.Usuario):"

    Se não existe o dado e você está usando um INNER JOIN, não retornará.

    Se apenas a tabela Solicitação é mandatória altere seus joins para LEFT JOIN ao invés de INNER JOIN. 

    Dessa maneira os dados dessa tabela serão retornados, independente de existir correspondência com as demais tabelas.

    Abaixo segue o código alterado considerando que deve ser retornado os dados da tabela Solicitaçao mesmo que não existam correspondentes nas tabelas Terminal, Auditoria, Acesso.Usuario

    ALTER VIEW [dbo].[vw_RelInclusaoGeralCivil]
    AS
    SELECT   
    DISTINCT   
    	m.Nome AS MunicipioNome, 
    	au.Nome UsuarioNome,
            s.TipoId AS SolicitacaoTipoId
    FROM					
    	Solicitacao s
    INNER JOIN
    	Unidade u 
    ON
    	s.UnidadeEntregaId = u.Id
    INNER JOIN
    	Endereco e
    ON
    	u.EnderecoId = e.Id
    INNER JOIN
    	[IBGE.Municipio] m
    ON
    	e.CodMunicipio = m.CodMunicipio
    LEFT JOIN
    	Terminal t
    ON
    	u.Id = t.UnidadeId
    LEFT JOIN
    	Auditoria a
    ON
    	t.Id = a.TerminalId
    LEFT JOIN
    	[Acesso.Usuario] au
    ON
    	a.UsuarioId = au.Id
    WHERE
    	s.TipoId <> 5
    AND
    	a.TerminalId IS NULL
    GO

    Espero ter ajudado.


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */


    quarta-feira, 4 de fevereiro de 2015 19:15
  • Mas aí o UsuarioNome fica como NULL
    quinta-feira, 5 de fevereiro de 2015 13:44
  • Jean,

    O campo fica como NULL porque não existe a correspondência dos dados entre as tabelas, assim como você mesmo sinalizou no seu post.

    Para o campo UsuarioNome vir com valores, deveria existir dados ligados tabela por tabela. Porém, pelo seu exemplo, a partir da tabela Terminal você não possui dados relacionados.

    Logo pense assim: como você vai recuperar o UsuarioNome de um IDAuditoria que não possui um terminal? E além disso, de um Terminal que não possui Unidade?

    Essas tabelas possuem FK entre elas?



    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    quinta-feira, 5 de fevereiro de 2015 15:35
  • Possuem
    quinta-feira, 5 de fevereiro de 2015 16:06
  • Então se você conseguiu inserir esses valores que você descreveu, é porque essas FKs estão com o NOCHECK, senão ele não permitiria, por exemplo, inserir o valor NULL no campo TerminalID da tabela Auditoria.

    Bom, se a sua modelagem é assim, como eu disse anteriormente, você só conseguirá obter o UsuarioNome se tiver dados corretamente relacionados em todas as tabelas do seu SELECT.

    Se todos os terminalID da tabela Auditoria ficarem como NULL, você nunca vai conseguir relacionar os dados como está fazendo. 

    Existe algum motivo para esse campo estar preenchido como NULL mesmo tendo FK para a tabela Terminal?


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    quinta-feira, 5 de fevereiro de 2015 16:11
  • Porque me falaram que o módulo ainda não foi implementado. Mas muito obrigado Mariana pela ajuda.
    quinta-feira, 5 de fevereiro de 2015 16:19