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 Viniciusr9
      Boa tarde pessoal,
      basicamente eu preciso do retorno de horas entre duas datas, porém tenho condições a tratar .
      basicamente tenho 2 colunas ( dt_fim e dt_ini ) que representam data final e data inicial. Preciso da diferença entre as duas retornada em uma outra coluna (hr_ausencias) , porém a cada dia posso computar no máximo 9 horas, e desconsiderar finais de semana e feriados( esses cadastrados em uma tabela) . Seria melhor tratar isso com uma Trigger , um Script PL/SQL , como me sugerem? Agradeço quem puder ajudar.
    • By eduardohaag
      Olá pessoal,
      Estou trabalhando em um projeto de estudo onde tenho uma tabela onde possui o cadastro de funcionários e a empresa onde trabalha.
      Preciso criar uma query que retorne o nome da empresa que possui a menor quantidade de funcionários.
      Tenho em minha mente que parece uma coisa simples, possivelmente utilizando as funções Count e MIN, mas não estou conseguindo chegar a um raciocino pra chegar nessa condição.
    • By edvaldo joviano de paula
      Prezados, boa tarde!
      Preciso de uma ajuda sendo possível:
       
      Tenho o seguinte cenário em uma consulta ( formação de kits de produtos tendo como produto principal um valor igual, ex: produto 1 é formado pelos produtos 2 e 3)
      select codkit, produtos from kit where codkit = 1
      ---   ----
      1    2
      1    3
      Percebem que o resultado traz o codigo do kit (1) e os produtos que compoem este kit (2,3), porem o produto 2 tambem faz parte do kit 4 junto com o produto 10 e produto 3 faz parte do kit 5 junto com o produto 11 sendo:
      kit 1 (2,3)
      kit 4 (2,10)
      kit 5 (3,11).
       
      Eu preciso de uma ajuda sobre alguma função que ao comprar os produtos 2 e 3 e estes estando na mesma nota fiscal (select produtos from notafiscal = x) traga o resultado do kit que estes dois produtos juntos formam, exemplo, ao pesquisar (select produtos from notafiscal = x) nesta nota existir os produtos 2 e 3 traga o resultado 1, se na nota existir os produtos 2 e 10 traga o resultado 4 e se existir na consulta dos itens da nota os itens 3 e 11 o resultado seja 5. Caso na pesquisa eventualmente existir por exemplo 10 unidades do item 2, 5 unidades do item 3 e 5 unidades do item 10, o resultado deve ser 1 e 4 pois 5 unidades do 2+5 unidades do 3 forma o kit 1 e 5 unidades do 2+ 5 unidades do 10 formam o kit 4.
       
      Espero ter explicado de forma a ser entendido e agradeço a ajuda.
       
    • By Viniciusr9
      Boa tarde pessoal,
      Sei que tem varios tópicos sobre esse erro, porém analisei todos e nenhum foi aplicável ao meu caso ( a maioria era porquê o pessoal esquecia do Group By ao final das Querys) . 
      Se alguém puder ajudar, agradeço . Os campos sem função estão inseridos no group by, porém o erro persiste .
       
       

       
      SELECT * FROM( select LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA AS PROJETO, E.DS_EQUIPE as EQUIPE, SUM(NVL((CC.QT_HORAS_CHEIA - SUM(AU.DT_FIM - AU.DT_INI)*24 ),CC.QT_HORAS_CHEIA)) as "ESFORÇO CALCULADO" from EQUIPE E, COLABORADOR C1, COMPETENCIA C, COMPETENCIA_COLABORADOR CC, AUSENCIAS AU where E.CD_EQUIPE=CC.CD_EQUIPE and C.CD_COMPETENCIA=CC.CD_COMPETENCIA and C1.CD_COLABORADOR=CC.CD_COLABORADOR and C1.STATUS = 1 AND C1.CD_GESTOR <> C1.CD_COLABORADOR AND AU.CD_COLABORADOR (+) = C1.CD_COLABORADOR GROUP BY E.DS_EQUIPE, LPAD(C.MES_COMPETENCIA,2,'0') ||'/'||C.ANO_COMPETENCIA ) VT WHERE VT.PROJETO = ((select to_char(sysdate, 'MM') from dual)||'/'||(select to_char(sysdate, 'RRRR') from dual))  
×

Important Information

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