Usuário com melhor resposta
View para quando não existe relacionamento entre as tabelas

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
- Editado Jean F Cavalcante quarta-feira, 4 de fevereiro de 2015 17:20
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 */
- Editado Mariana Del Nero quarta-feira, 4 de fevereiro de 2015 19:18 Inserção de exemplo
- Sugerido como Resposta Durval RamosModerator quarta-feira, 4 de fevereiro de 2015 22:56
- Marcado como Resposta Jean F Cavalcante quinta-feira, 5 de fevereiro de 2015 16:19
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 */
- Editado Mariana Del Nero quarta-feira, 4 de fevereiro de 2015 19:18 Inserção de exemplo
- Sugerido como Resposta Durval RamosModerator quarta-feira, 4 de fevereiro de 2015 22:56
- Marcado como Resposta Jean F Cavalcante quinta-feira, 5 de fevereiro de 2015 16:19
-
-
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 */
-
-
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 */
-