Jump to content
Mvc

Retornar dados de tabelas distintas qdo uma delas ainda não foi populada

Recommended Posts

Olá,

Gostaria de fazer uma query mas o retorno ou vem ou não vem dados. Vou citar exemplos.

 

Me ajudem PF se o melhor caso é union ou outro?

 

1) Tabela 1 e tabela 2 com campos distintos e um campo em comum com Join no campo card.

Resultado: No meu select qdo tem dados nas 2 tabelas então retornam todos em comum em uma única linha.

 

Tabela 1(id, card)

1, xxx

2, yyy

3, zzz

Tabela 2 (id, card, fraude)

1, xxx, sim 

2, yyy, sim

3, zzz, pendente

 

Select a.id, a.card, b.card, b.fraude

from t1 a,t2 b

where  a.card=b.card;

 

Retorno:

Id,Card,Card,fraude

1, xxx,xxx,sim

2, yyy,yyy,sim

3, zzz,zzz,pendente

 

O problema é qdo na tabela 2 não tem o dado:

2)Tabela 1 e tabela 2 com campos distintos e um campo em comum com Join no campo card.

Resultado: No meu select qdo tem dados na tabela 1 e não tiver dado na tabela 2 então retornam linha que só tem na tabela 1.

 

 

Tabela 1(id, card)

1, xxx

2, yyy

3, zzz

4,xyz

 

Tabela 2 (id, card, fraude)

1, xxx, sim 

2, yyy, sim

3, zzz, pendente

 

Select a.id, a.card, b.card, b.fraude

from t1 a,t2 b

where  a.card=b.card;

 

Retorno:

Id,Card,Card,fraude

Nenhuma linha

Ou não estou certo, retorna igual ao exemplo1:

1, xxx,xxx,sim

2, yyy,yyy,sim

3, zzz,zzz,pendente

 

Pergunto, neste exemplo 2 como faço pra retornar somente todas as linhas e se não tiver a linha na tabela 2 ficar com estes campos null? 

 

Desta forma;

 

Retorno:

Id,Card,Card,fraude

1, xxx,xxx,sim

2, yyy,yyy,sim

3, zzz,zzz,pendente

4,xyz,null,null

Ou no lugar de null, ficar vazia as colunas REF a tabela 2.

 

Na vdd são exemplos, mas a qtd de Join é mais complexos

Muito obrigado!!!!

 

 

 

 

Share this post


Link to post
Share on other sites

tenta com left join

 

Select a.id, a.card, b.card, b.fraude

from t1 a,t2 b

where  a.card=b.card(+);

Share this post


Link to post
Share on other sites
1 hora atrás, NaPraia disse:

tenta com left join

 

Select a.id, a.card, b.card, b.fraude

from t1 a,t2 b

where  a.card=b.card(+);

Estás de volta ? A quarentena fez a PM te expulsar da Praia !? :)

Share this post


Link to post
Share on other sites
Em 11/04/2020 at 12:40, Motta disse:

Estás de volta ? A quarentena fez a PM te expulsar da Praia !? :)

faz parte, estamos aí

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

  • Similar Content

    • By gamesmax2
      Boa noite,
      Pessoal estou com uma dificuldade no MYSQL, estou querendo obter dados de um cadastro caso ele tenha preenchido todos os Campos, tentei usar o Group by mas não tive sucesso.
       
      Minha tabela e a seguinte:
       
      Nome.              Pedido.            Status
      Daniel.              9955.                 Ok
      Daniel.              9954                  Ok
      Rafael.              9940                  Ok
      Rafael.              9941.                 Aberto
      Rafael.              9942.                 Ok
      Rodrigo.            9961.                 Ok
      Rodrigo.            9962.                 Ok
       
       
      Meu objetivo e puxar os nomes que estão com todos o pedidos relacionado em ok, no caso o Rafael não pode aparece pois ele tem um pedido Aberto, porém não conseguir fazer isso, pessoal peco a ajuda de VCS muito o obrigado.
       
      tentei isso aqui: SELECT nome, pedido, status FROM `cadastros` GROUP BY pedido, nome having status = 'Ok'
    • By gamesmax2
      Boa tarde,
      Pessoal estou com uma dificuldade no MYSQL, estou querendo obter dados de um cadastro caso ele tenha preenchido todos os Campos, tentei usar o Group by mas não tive sucesso.
       
      Minha tabela e a seguinte:
       
      Nome.              Pedido.            Status
      Daniel.              9955.                 Ok
      Daniel.              9954                  Ok
      Rafael.              9940                  Ok
      Rafael.              9941.                 Aberto
      Rafael.              9942.                 Ok
      Rodrigo.            9961.                 Ok
      Rodrigo.            9962.                 Ok
       
       
      Meu objetivo e puxar os nomes que estão com todos o pedidos relacionado em ok, no caso o Rafael não pode aparece pois ele tem um pedido Aberto, porém não conseguir fazer isso, pessoal peco a ajuda de VCS muito o obrigado.
       
      tentei isso aqui: SELECT nome, pedido, status FROM `cadastros` GROUP BY pedido, nome ORDER BY having status = 'Ok'  
       
    • By Thiago Btos
      Bom dia pessoal.
       
      Estou com uma dúvida na estruturação do select.
      Tenho um relatório que está extraindo já informações corretamente, com base no período gerado (inicial e final)
      Exemplo de como está hoje:
      SELECT D.CATEGORIA, SUM(D.VALOR) AS VALOR_VENDA, D.DATA AS (MES_ANO) FROM DUAL D WHERE D.DATA BETWEEN '20210501' AND '20210731' GROUP BY D.CATEGORIA, D.DATA Retornando:
      Categoria | Valor_venda     | Mes_Ano
      1                |     1000,00         | 05/2021
      1                |     2000,00         | 06/2021
      1                |       800,00         | 07/2021
      2                |      500,00          | 05/2021
      2                |      200,00          | 07/2021
      2                |      700,00          | 06/2021
       
      Até ai está tranquilo.
      Porém foi solicitado para adicionar uma coluna YTD (Year to data - acumulado do ano) agrupando o valor total da venda do ano do filtro.
      Então se foi colocado uma data do período Jan/2020 a Mar/2020, essa nova coluna tem que pegar as vendas do ano inteiro de 2020
       
      E precisa me retornar assim:
       
      Categoria | Valor_venda     | Mes_Ano  |  YTD
      1                |     1000,00         | 05/2021   |  15000,00
      1                |     2000,00         | 06/2021   |  15000,00
      1                |       800,00         | 07/2021   |  15000,00
      2                |      500,00          | 05/2021   |  8000,00
      2                |      200,00          | 07/2021   |  8000,00
      2                |      700,00          | 06/2021   |  8000,00
       
      (Os valores de 15000 e 8000 seria a soma do ano inteiro)
       
      O que consegui pensar seria um subselect que tem o where com data do ano, porém nesse caso retorno mais de um resultado no subselect, não dando para usar...
       
      Qual seria a alternativa que tenho?
       
    • By henriquers
      Boa Tarde, a todos
       
      Estou fazendo um relatório que traz em uma pagina web um relatório para ser impresso, mas estou tendo um problema de desempenho para trazer os dados para a pagina web.
      Tenho uma consulta onde traz todos os ID dos funcionários e salvo cada um deste resultado em um Array. E com esses IDs salvo em um array eu faço um loop e dentro faço um select filtrando cada ID de funcionário onde neste select traz as informações de cada um dos funcionário, mas estou com problema nesse select dentro do loop, pois demora quase 2 min para finalizar todas as consultas e trazer as informações na pagina são mais de 130 consulta que faz.
      Pensei em alguns modos de salvar os os todos dados em array com a penas um select mas não consigo filtra por ID.
      $selRE = "SELECT * FROM(SELECT DISTINCT RE, NOME FROM ENG_REL_EPIS WHERE to_date(DATA,'DD/MM/YY') BETWEEN to_date('$dataIni','DD-MM-YY') AND to_date('$dataFim','DD-MM-YY') ) ORDER BY NOME ASC "; $parse2 = oci_parse($conn,$selRE); oci_execute($parse2); while($fetch2=oci_fetch_assoc($parse2)) { $re2[] = $fetch2['RE']; } $cnt = count($re2); $i = 0; while($i < $cnt ){ $select = "SELECT DISTINCT CA,PRODUTO,DESCRICAO,DATA,RE,NOME,QTD FROM ENG_REL_EPIS WHERE to_date(DATA,'DD/MM/YY') BETWEEN to_date('$dataIni','DD-MM-YY') AND to_date('$dataFim','DD-MM-YY') AND RE ='$re2[$i]' ORDER BY DATA ASC"; // echo $select."<br>"; $parse=oci_parse($conn,$select); oci_execute($parse); $fetch=oci_fetch_array($parse); echo " <div class='tamanho'> <br> <!-- ============== BEGIN CABEÇALHO ==================--> <div class='row borda'> <div class='col-sm-4'> <img src='./../../img/logo_p.png' alt='some text' class='logo'> </div> <div class='col-sm borda_esquerda titulo2'> Ficha de Registro de Entrega de Equipamentos de Proteção Individual </div> </div> <br> <div class='row borda titulo'> <div class='col'> PERÍODO: $dataIni a $dataFim </div> </div> <br> <div class='row borda_esquerda_direita_top titulo'> <div class='col'> PRODUTOS </div> </div> <div class='row titulo'> <div class='col-2 borda_top_esquerda'> Data </div> <div class='col-2 borda_top_esquerda'> Código </div> <div class='col-1 borda_top_esquerda'> Qtd </div> <div class='col-1 borda_top_esquerda'> CA </div> <div class='col borda_esquerda_direita_top'> Descrição </div> </div> "; do{ $DATA = date('d/m/Y', strtotime($fetch["DATA"])); $PRODUTO = $fetch["PRODUTO"]; $QTD = $fetch["QTD"]; $CA = $fetch["CA"]; $DESCRICAO = mb_strimwidth($fetch["DESCRICAO"], 0, 48, "..."); $RE = $fetch["RE"]; $NOME = $fetch["NOME"]; echo " <div class='row conteudo'> <div class='col-2 borda_top_esquerda'> $DATA </div> <div class='col-2 borda_top_esquerda'> $PRODUTO </div> <div class='col-1 borda_top_esquerda'> $QTD </div> <div class='col-1 borda_top_esquerda'> $CA </div> <div class='col borda_esquerda_direita_top'> $DESCRICAO </div> </div> "; }while($fetch=oci_fetch_array($parse)); echo " <div class='row borda_top'> &nbsp; </div> <div class='row borda_esquerda_direita_top'> <div class='texto'> Eu $NOME, R.E. $RE. De acordo com as normas regulamentadoras (N.R.) 1.7 e 6.1, declaro e confirmo que recebi da Engemet Metalurgia e Comercio Ltda os Equipamentos de Proteção Individual necessários à minha função, discriminados e assinados por mim, abaixo. Afirmo ainda ter ciência da obrigatoriedade do bom uso e conservação destes, bem como a instrução devida para o uso correto. </div> <br> </div> <div class='row '> <div class='col borda_esquerda_direita_baixo'> <div class='titulo'> $data <br> <br> </div> </div> </div> <div class='row'> <div class='col'> <div class='titulo'> <br><br><br> Assinatura:_____________________________________________________________ </div> </div> </div> </div> <p style='page-break-before:always'></p> "; $i++; oci_free_statement($parse); }  
    • By marco tulio sousa
      Boa tarde,
       
      FIz a declaração abaixo e tinha expectativa que o relatório retornado tivesse datas de inicio e termino de afastamento e ferias.
      Afastamentos estão em 1 tabela e férias em outra.
      Erro ORA-000936
      Que devo fazer?
       
       
      SELECT 
      SUBSTR(RHCGED_ALT_SIT_FUN.CODIGO, -6)
      Matric,
      RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL,
      CASE
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1216' THEN 'ATESTADO'
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1211' THEN 'INSS'
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1220' THEN 'INSS'
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1218' THEN 'MATERNID'
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1118' THEN 'MATERNIDADE'
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1318' THEN 'PATERNIDADE'
       WHEN RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL = '1210' THEN 'LIC REMUN'
      END TIPO_AFAST,
      TO_DATE(RHCGED_ALT_SIT_FUN.DATA_INIC_SITUACAO) DT_INIC_AFAST,
      TO_DATE(RHCGED_ALT_SIT_FUN.DATA_FIM_SITUACAO) DT_FIM_AFAST,
      TO_DATE(RHFERI_FERIAS.DT_INI_GOZO) DT_INIC_FERIAS,
      TO_DATE(RHFERI_FERIAS.DT_FIM_GOZO) DT_FIM_FERIAS
       
      FROM CRHH.RHCGED_ALT_SIT_FUN
      INNER JOIN CRHH.RHFERI_FERIAS ON RHCGED_ALT_SIT_FUN.CODIGO = RHFERI_FERIAS.CODIGO_CONTRATO

      WHERE 
      RHCGED_ALT_SIT_FUN.COD_SIT_FUNCIONAL In ('1216','1211','1220','1218','1118','1318','1210')
      AND
      CRHH.RHCGED_ALT_SIT_FUN.CODIGO >=lpad(:texto_1,15,'0')
      AND RHCGED_ALT_SIT_FUN.CODIGO  <=lpad(:texto_2,15,'0')
      ORDER BY RHCGED_ALT_SIT_FUN.DATA_INIC_SITUACAO DESC
×

Important Information

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