Jump to content
Sign in to follow this  
fimiani_lucas

Dúvida sobre fazer dois left join na mesma querry

Recommended Posts

Bom dia,

Tenho uma base de dados que não é normalizada e possui muitos problemas que tenho que tratar no where. Basicamente o que quero fazer é uma view de algumas tabelas. O primeiro código que eu fiz é o seguinte:

SELECT



       GSI_PROYECTOS.ID_PROYECTO,
       GSI_PROYECTOS.NOMBRE AS NOMBRE_PREVENTA,
       GSI_PROYECTOS.ID_REGION_PAIS,
       GSI_REGIONES_PAISES.NOMBRE_REGION,
       GSI_REGIONES_PAISES.ID_CLUSTER,
       GSI_CLUSTERS.NOMBRE AS NOMBRE_CLUSTER,
       GSI_PROYECTOS.ID_PAIS,
       GSI_PAISES.NOMBRE_PAIS,
       GSI_PROYECTOS.ID_CIUDAD,
       GSI_CIUDADES.NOMBRE_CIUDAD,
       GSI_PROYECTOS.ID_IDIOMA_PROYECTO,
       GSI_IDIOMAS.DESCRIPCION,
       GSI_PROYECTOS.ID_CLIENTE,
       GSI_CLIENTES.NOMBRE_CLIENTE,
       GSI_PROYECTOS.ID_TIPO_PROYECTO,
       GSI_TIPOS_PROYECTO.NOMBRE_TIPO,
       GSI_PROYECTOS.ID_ESTADO_GOAL,
       GSI_ESTADOS_GOAL.NOMBRE_ESTADO,
       GSI_PROYECTOS.ID_PRODUCTO,
       GSI_PRODUCTOS.NOMBRE_PRODUCTO,
       GSI_PRODUCTOS.ID_HERRAMIENTA,
       GSI_HERRAMIENTAS.NOMBRE_HERRAMIENTA,
       GSI_PROYECTOS.ID_SECTOR,
       GSI_SECTORES.NOMBRE_SECTOR,
       GSI_PROYECTOS.ID_RESP_PROYECTOS,
       GSI_PROYECTOS.FECHA_INI,
       GSI_PROYECTOS.FECHA_CREACION,
       GSI_PROYECTOS.FECHA_FIRMA_PREVISTA,
       GSI_PROYECTOS.FECHA_FIN,
       GSI_PROYECTOS.ID_EMPRESA_GOAL,
       GSI_EMPRESA_GOAL.NOMBRE_EMPRESA,
       GSI_PROYECTOS.GESTOR_CUENTA,
       GSI_PROYECTOS.FINANCIADO,
       GSI_PROYECTOS.DEFAULT_PROYECT,
       GSI_PROYECTOS.ES_PROY_PADRE,
       GSI_PROYECTOS.OBSERVACIONES,
       GSI_PROYECTOS.DURACION_PREVISTA,
       GSI_PROYECTOS.PORCENTAJE_EXITO,
       GSI_PROYECTOS.ID_PARTNER,
       GSI_PROYECTOS.ESFUERZO_PREVISTO,
       GSI_PROYECTOS.OFERTADO,
       GSI_PROYECTOS.ID_DIVISA,
       GSI_DIVISAS.NOMBRE,
       GSI_DIVISAS.CODIGO_ISO,
       GSI_DIVISAS.VALOR_CONVERSION,
       GSI_PROYECTOS.OTROS_GASTOS,
       GSI_PROYECTOS.ESTIMACION_DE_COSTE,
       GSI_PROYECTOS.DURACION_ALQUILER,
       GSI_PROYECTOS.ALQUILER_FACTURADO,
       GSI_PROYECTOS.FACT_IMP_PREV,
       GSI_PROYECTOS.FACT_LIC_PREV,
       GSI_PROYECTOS.FACT_MANT_PREV,
       GSI_PROYECTOS.FACT_ADAP_PREV,
       GSI_PROYECTOS.FACT_LIC_DIV,
       GSI_PROYECTOS.FACT_IMP_DIV,
       GSI_PROYECTOS.FACT_MANT_DIV,
       GSI_PROYECTOS.FACT_ADAP_DIV,
      GSI_PROYECTOS.FACTURACION_PREVISTA, 
      GSI_PROYECTOS.MOTIVO_CAMBIO
             
FROM  
       GSI_PROYECTOS,
       GSI_REGIONES_PAISES,
       GSI_CLUSTERS,
       GSI_PAISES,
       GSI_CIUDADES,
       GSI_IDIOMAS,
       GSI_CLIENTES,
       GSI_TIPOS_PROYECTO,
       GSI_ESTADOS_GOAL,
       GSI_PRODUCTOS,
       GSI_HERRAMIENTAS,
       GSI_SECTORES,
       GSI_EMPRESA_GOAL,
       GSI_DIVISAS


WHERE  


       GSI_PROYECTOS.ID_TIPO_PROYECTO            = 3                                                                                     AND 
       GSI_PROYECTOS.ID_REGION_PAIS                   = GSI_REGIONES_PAISES.ID_REGION                         AND 
       GSI_REGIONES_PAISES.ID_CLUSTER               = GSI_CLUSTERS.ID_CLUSTER                                    AND 
       GSI_PROYECTOS.ID_PAIS                                  = GSI_PAISES.ID_PAIS                                                    AND 
       GSI_PROYECTOS.ID_CIUDAD                            = GSI_CIUDADES.ID_CIUDAD                                         AND 
       GSI_PROYECTOS.ID_IDIOMA_PROYECTO        = GSI_IDIOMAS.ID_IDIOMA                                            AND
       GSI_PROYECTOS.ID_CLIENTE                           = GSI_CLIENTES.ID_CLIENTE                                        AND
       GSI_PROYECTOS.ID_TIPO_PROYECTO            = GSI_TIPOS_PROYECTO.ID_TIPO_PROYECTO         AND
       GSI_PROYECTOS.ID_ESTADO_GOAL                = GSI_ESTADOS_GOAL.ID_ESTADO_GOAL                 AND
       GSI_PROYECTOS.ID_PRODUCTO                      = GSI_PRODUCTOS.ID_PRODUCTO                            AND
       GSI_PRODUCTOS.ID_HERRAMIENTA               = GSI_HERRAMIENTAS.ID_HERRAMIENTA                     AND
       GSI_PROYECTOS.ID_SECTOR                          = GSI_SECTORES.ID_SECTOR                                       AND
       GSI_PROYECTOS.ID_EMPRESA_GOAL            = GSI_EMPRESA_GOAL.ID_EMPRESA_GOAL              AND
       GSI_PROYECTOS.ID_DIVISA                             = GSI_DIVISAS.ID_DIVISA 
Mas eu descobri que na tabela principal GSI_PROYECTOS possui muitos codigos como exemplos(ID_REGION, ID_PAIS, ETC) estão preenchidos com nulo, portanto o where não funciona muito bem. Deste modo alterei o where para retornar as linhas mesmo que o valor seja nulo:
SELECT B.ID_PROYECTO,

  B.NOMBRE AS NOMBRE_PREVENTA,
  B.ID_REGION,
  B.NOMBRE_REGION,
  B.ID_PAIS,
  B.ID_IDIOMA_PROYECTO,
  B.ID_CLIENTE,
  B.ID_CIUDAD,
  B.ID_TIPO_PROYECTO,
  B.ID_ESTADO_GOAL,
  B.ID_PRODUCTO,
  B.ID_SECTOR,
  B.ID_RESP_PROYECTOS,
  B.FECHA_INI,
  B.FECHA_CREACION,
  B.FECHA_FIRMA_PREVISTA,
  B.FECHA_FIN,
  B.ID_EMPRESA_GOAL,
  B.GESTOR_CUENTA,
  B.FINANCIADO,
  B.ES_PROY_PADRE,
  B.OBSERVACIONES,
  B.DURACION_PREVISTA,
  B.PORCENTAJE_EXITO,
  B.ID_PARTNER,
  B.ESFUERZO_PREVISTO,
  B.OFERTADO,
  B.ID_DIVISA,
  B.ESTIMACION_DE_COSTE,
  B.MOTIVO_CAMBIO
       
       
FROM   (
SELECT* FROM(
SELECT PR1.ID_PROYECTO,PR1.NOMBRE,PR1.ID_REGION,PR1.ID_PAIS,PR1.ID_CIUDAD,PR1.ID_IDIOMA_PROYECTO,PR1.ID_CLIENTE,
  PR1.ID_TIPO_PROYECTO,PR1.ID_ESTADO_GOAL,PR1.ID_PRODUCTO,PR1.ID_SECTOR,PR1.ID_RESP_PROYECTOS,
  PR1.FECHA_INI,PR1.FECHA_CREACION,PR1.FECHA_FIRMA_PREVISTA,PR1.FECHA_FIN,PR1.ID_EMPRESA_GOAL,PR1.GESTOR_CUENTA,
  PR1.FINANCIADO,PR1.ES_PROY_PADRE,PR1.OBSERVACIONES,PR1.DURACION_PREVISTA,
  PR1.PORCENTAJE_EXITO,PR1.ID_PARTNER,PR1.ESFUERZO_PREVISTO,PR1.OFERTADO,PR1.ID_DIVISA,PR1.ESTIMACION_DE_COSTE,
  PR1.MOTIVO_CAMBIO,CI.NOMBRE_CIUDAD 
FROM (
SELECT * 
FROM GSI_PROYECTOS 
WHERE  GSI_PROYECTOS.ID_TIPO_PROYECTO  = 3             
) PR1 
LEFT JOIN GSI_CIUDADES CI 
ON PR1.ID_CIUDAD = CI.ID_CIUDAD
) A


LEFT JOIN( 
                SELECT R.NOMBRE_REGION,R.ID_REGION FROM
                GSI_REGIONES_PAISES R 
                )RE
            ON A.ID_REGION = RE.ID_REGION
)B
Mas agora estou com problema na comparação do campo ID_REGION pois ele esta nos dois LEFT JOIN. Alguem poderia me ajuda?

Share this post


Link to post
Share on other sites

A SQL é meio grande para tentar entender o que faz , mas o OUTER JOIN deve resolver a questão.

Usando a notação do Oracle algo como

PR1.ID_CIUDAD (+) = CI.ID_CIUDAD

ou

usando o left outer join

Share this post


Link to post
Share on other sites

Motta,

O que esta acontecendo é o seguinte:

A tabela GSI_PROYECTOS é a tabela mãe, ou seja, possui campos como COD_CIUDAD, COD_PAIS, COD_CLIENTE

e as outras tabelas são tabelas de dominio, ou seja, eu vou buscar a descrição dos campos COD_CIUDAD, COD_PAIS, etc nestas tabelas.

O problema é que existem campos que a aplicação não obriga o usuario inserir um valor e deste modo a aplicação insere null no campo COD_CIUDAD por exemplo. Assim, quando eu faço diversos JOINs eu nao encontro o registro por que nao existe um domino null com uma descricao de nao existente.

O que eu preciso é que o WHERE preencha os campos descrição e caso o campo esteja null ele retorna vazio no campo descricao.

Ex.

SELECT A.COD_NOME,

B.DESCRICAO_NOME

FROM TB_CLIENTE A, TB_DESCRICAO B

WHERE A.COD_NOME = B.NOME

Share this post


Link to post
Share on other sites


SELECT A.COD_NOME,

B.DESCRICAO_NOME

FROM TB_CLIENTE A, TB_DESCRICAO B

WHERE A.COD_NOME = B.NOME (+)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By eduardo_barros
      Boa tarde,
       
      Possuo uma aplicação rodando em Laravel com Db Mysql.
       
      Porem um cliente solicitou que o nosso sistema ficasse gravando informações no banco de dados SQL deles e vice e versa, só que o sistema deles não tem API, nesse caso vamos executar as queries do banco banco deles do nosso lado lendo e escrevendo, como funciona essa multiconexão de bancos dentro do laravel?
    • By thiago009
      Sou novato na área, estou criando um site para praticar, o meu problema está na página contatos. O objetivo é que ele salve os dados do formulário num arquivo do access. Sei que não é o ideal, como estou começando na área, acho que é melhor aprender assim para depois estudar outras formas.
      Criei um comando no SQL que intitulei de "grava", o nome do meu arquivo do access é "banco" e o html é contato.
      Tentei também validar os campos com java, mas não deu certo e exclui os códigos que tinha colocado no início do html, se alguém puder me ajudar a fazer a validação.
      Isso não é um trabalho, estou fazendo para aprender.

      Segue link com os arquivos:
      https://etecspgov-my.sharepoint.com/:f:/g/personal/thiago_cunha35_etec_sp_gov_br/EioK0B6ZHaNNlJ6zZWSXSfUB7PwxWfp-R5ulmqZOr1Hlpg?e=v51d7i
       
       
      Agradeço quem puder ajudar,
       

      Muito Obrigado.
    • By Robson Barros da Rocha
      Bom dia povo. Tenho um problema, e não uma dúvida. Eu executo no SQL Server esta query para agrupar os resultados cujo tenha o código do comprovante repetido:
      SELECT * FROM SHOP_Pedidos WHERE show='1' GROUP BY comprovante As colunas são:
      ID = Se preenche automaticamente
      comprovante = Recebe o código do comprovante
      productName = Nome do produto
      productValue = Valor do produto
      dateSent = Data que o produto foi enviado
      show = Enviado (1) e não enviado (0)
       
      A query que mostrei acima, não retorna dados porque aparece esse erro: "Column 'SHOP_Pedidos.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause." Certo, então aí que está o problema. Vendo o erro, eu troquei a * pela coluna comprovante, e resultou, mas a consulta só retorna a coluna comprovante (por conta do SELECT estar especificando somente ele. 
       
      A dúvida é: Tem como recuperar todos as colunas, assim como mysql?
    • By Pedro Vinicius Miguel Dias
      Pessoal, estou estudando o Banco de Dados Oracle e estou tendo um problema pra criar uma nova conexão.
      Durante o curso, o instrutor pede que eu crie duas conexoes, a TESTE com a senha: teste e a PRATICA com a senha :pratica... cada uma com uma senha e etc e elas funcionam.
      Eu por minha conta quis criar outra conexão com outro nome e outra senha, Ex. (User TESTE2 e senha: teste2) e ao testar, o Banco não conecta. Erro ORA-01017.
       
      Alguém consegue me ajudar?
    • By Matsuura
      Estou tentando criar o usuário o Scott, e na internet encontro bastante tutoriais para instalação do HR, para o scott dois que me referenciei foram:
      https://www.profissionaloracle.com.br/swillians/forums/topic/usuario-scott-tiger-banco-oracle-10g-express-edition-xe/
      https://docs.oracle.com/database/121/COMSC/installation.htm#COMSC00007
       
      no primeiro link que tentei seguir não encontrei após a intalação o arquivo "demobld.sql"estou enviando a imagem com nome "sql1" e "sql2" que mostram a minha tentativa de instalação, com as mensagens de erros que me retornaram, no segundo link mostra as instalações de schemas, mas não mostra especificamente o Scott. 
      Espero que possam me ajudar, estou a mais de duas semanas tentando sem exito.


×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.