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 massaotoda
      estou tentando fazer a conexão ao banco de dados oracle 11g no delphi 10.2 pelo fireDAC e está reportando o seguinte erro ao conectar:
      [FireDAC][Phys][Ora] Ora-12546: TNS: permission denied.

      já mandei para o DBA para verificar e ainda não consegui o retorno, fiz o teste conectando em outro banco de dados por exemplo do firebird e conectou ok...

      Alguém saberia me disse qual seria esta permissão para resolver o problema???
    • By vinihhylian0103
      Boa noite, gostaria de saber tem alguma maneira de prevenir a inclusão de registros do mesmo valor na minha tabela. O código é o seguinte:
       
       
       
      <?php include_once('conexao.php'); $nome=$_POST['nome']; $sobrenome=$_POST['sobrenome']; $data=$_POST['data_nasc']; $rm=$_POST['rm']; $curso=$_POST['curso']; $email=$_POST['email']; $senha=$_POST['senha']; $sqlinsert = "insert into usuarios(nome, sobrenome, data_nasc, rm, curso, email, senha) values('$nome','$sobrenome','$data','$rm','$curso','$email','$senha')"; $resultado = @mysqli_query($conexao,$sqlinsert); if(!$resultado) { die('Query inválida: '. @mysqli_error($conexao)); } else { echo "<script type='text/javascript'>alert('Cadastro Concluído!');</script>"; header('Location: index.html'); } mysqli_close($conexao); ?>
          
       
    • By alextds
      olá gostaria de saber como fazer para obter o rank das 5 maiores vendas.
      tenho a seguinte tabela:
       
      data                 produto    valor
      31/01/2018    calça       100
      31/01/2018    calça        50
      31/01/2018    camisa    30
      31/01/2018    camisa    30
      31/01/2018    sapato     75
      31/01/2018    bermuda 100
      31/01/2018    meia         10
      31/01/2018    tenis         65
      31/01/2018    luva          20
      31/01/2018    luva          20
      31/01/2019    calça       100
      31/01/2019    calça        50
      31/01/2019    camisa    30
      31/01/2019    camisa    30
      31/01/2019    sapato    75
      31/01/2019    bermuda 100
      31/01/2019    meia         10
      31/01/2019    tenis         65
      31/01/2019    luva          20
      31/01/2019    luva          20  
       
      Preciso que totalize os valores de acordo a data e produto e que apareça somente os 5 primeiros dessa forma  :
       
      data                 produto       valor   rank
      31/01/2018    calça           150      1
      31/01/2018    bermuda    100       2
      31/01/2018    sapato        75         3
      31/01/2018    tenis            65        4
      31/01/2018    camisa        60        5
      31/01/2019    calça           150      1
      31/01/2019    bermuda     100      2
      31/01/2019    sapato         75        3
      31/01/2019    tenis             65       4
      31/01/2019    camisa         60       5
       
      Se alguém tiver uma solução facil agradeço.
       
       
    • By samuelpanamericana
      Olá Pessoal, estou com um problema com relação ao Oracle em nossas máquinas aqui! Quando tentamos acessar o SGT (sistema de gerenciamento textil) através de um usuário de rede comum sem privilégios administrativos na máquina ele apresenta o seguinte erro ERRO: "Oracle não instalado ou seu caminho é inválido. Consulte o seu superior [\Bin\ORA803.dll]" Código de erro 803 O usuário não tem acesso ao Oracle Path por ser um usuário comum sem privilégios administrativos, devido a problemas de segurança não queremos deixar os usuários com privilégios administrativos evitando assim problemas com a alteração e instalação de programas, abrimos esse tópico para resolver este problema da necessidade de ser um administrador da máquina para executar o SGT, precisamos que usuários sejam comuns para acessá-lo! Confirmei que o usuário está tendo privilégios apropriados no caminho binário Oracle. Os usuários têm acesso completo ao caminho "C: \ Oracle", eu já configurei dessa maneira: Cliquei com o botão direito do mouse na pasta oracle/segurança/usuários do domínio/controle total A única maneira que nosso programa(SGT) pode encontrar a pasta oracle é definir os usuários do domínio para o grupo de administradores Porém tivemos alguns problemas ao fazer isso como por exemplo usuarios instalando programas de terceiro e efetuando alterações nas máquinas. Se alguém já passou pela mesma situação ou situação parecida eu ficaria grato se pudessem ajudar!! Atenciosamente Samuel
    • By Viniciusr9
      Script com retorno de dias uteis no mês ( desconsiderando finais de semana e feriados também ( os mesmos cadastrados em uma tabela )), ajuda!
       
      Boa tarde,
      alguém poderia me ajudar , tentei com alguns que vi pela net , fazendo alterações mas não consegui o que gostaria ainda. Preciso de um script que dado um valor (mês/ano) ele retorne a quantidade de dias uteis nesse mês, desconsiderando os sabados e domingos e os feriados listados na tabela de feriados, em Oracle Sql puro ou PL/SQL  . Agradeço pela ajuda!
×

Important Information

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