none
Query trazendo registros fora da condição RRS feed

  • Pergunta

  • Bom dia,

    Galera!

    Gostaria de uma ajuda, Estou desenvolvendo uma query porém a mesma está trazendo vários registros fora da condição do Exists, nesta query preciso que traga todos os registros onde a existis um lançamento com o código 60.13.005

        SELECT 
    		PDF.DocFinChv  As 'Chave' ,
    		PDF.MovCtrlBancNum As 'Num_Mov',
    		PDF.EntCod As 'Cod_Ent', 
    		PDF.ParcDocFinEntNome As 'Nome_Entidade',
    		PDF.ParcDocFinTipoLanc As 'Tipo',
    		PDF.ParcDocFinDupNum As 'Documento', 
    		PDF.ParcDocFinDataVenc As 'Data_Venc',
    		PDF.ParcDocFinDataPag As 'Data_Pag',
    		PDF.ParcDocFinValOrig As 'Valor_Orig',
    		PDF.ParcDocFinValPag As 'Valor_Pago',
    		PDF.ParcDocFinObs As 'Obs.' ,
    		'Dias' =   DATEDIFF(DAY, PDF.ParcDocFinDataPag ,PDF.ParcDocFinDataVenc)
    		
    	FROM 
    			PARC_DOC_FIN PDF WITH(NOLOCK)
    			
    	WHERE   
    								            
              PDF.ParcDocFinDataPag BETWEEN '20161001' AND '20161028' 					            			            
              AND  EXISTS (SELECT * FROM DOC_FIN_CLASSE_REC_DESP DFCRD WITH(NOLOCK)
    					            WHERE DFCRD.CLASSERECDESPCODESTR = '60.13.005' )

    sexta-feira, 28 de outubro de 2016 12:22

Respostas

  • Boa tarde,

    Acho que é possível obter o resultado esperado com a query abaixo (sem a procedure):

    with CTE_PDF as
    (
        SELECT 
            PDF.MovCtrlBancNum
        FROM PARC_DOC_FIN PDF WITH(NOLOCK)
        WHERE   
            PDF.ParcDocFinDataPag BETWEEN @DataInicial AND @DataInicial AND
            EXISTS 
                (SELECT * FROM DOC_FIN_CLASSE_REC_DESP DFCRD WITH(NOLOCK)
                 WHERE 
                     DFCRD.CLASSERECDESPCODESTR = '60.13.005' And 
                     PDF.DocFinChv = DFCRD.DocFinChv)
    )
    
    SELECT 
        PDF1.DocFinChv  As 'Chave' ,
        PDF1.MovCtrlBancNum As 'Num_Mov',
        PDF1.EntCod As 'Cod_Ent', 
        PDF1.ParcDocFinEntNome As 'Nome_Entidade',
        PDF1.ParcDocFinTipoLanc As 'Tipo',
        PDF1.ParcDocFinDupNum As 'Documento', 
        PDF1.ParcDocFinDataVenc As 'Data_Venc',
        PDF1.ParcDocFinDataPag As 'Data_Pag',
        PDF1.ParcDocFinValOrig As 'Valor_Orig',
        PDF1.ParcDocFinValPag As 'Valor_Pago',
        PDF1.ParcDocFinObs As 'Obs.' ,
        'Dias' =   DATEDIFF(DAY, PDF1.ParcDocFinDataPag ,PDF1.ParcDocFinDataVenc)
    FROM CTE_PDF as PDF
    INNER JOIN PARC_DOC_FIN PDF1 WITH(NOLOCK)
        ON PDF1.MovCtrlBancNum = PDF.MovCtrlBancNum

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 28 de outubro de 2016 18:21

Todas as Respostas

  • Leandro,

    Você precisa de uma condição no seu EXISTS que associe o resultset da query principal a ele, como uma FK, por exemplo.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    sexta-feira, 28 de outubro de 2016 12:33
  • Analisando sua query , vc tem dois conjuntos DISJUNTOS

    Existe um elo de ligação entre  PARC_DOC_FIN e  DOC_FIN_CLASSE_REC_DESP ??

    se sim use Joins

    se não  existe um campo na  tabela  PARC_DOC_FIN  com o valor '60.13.005'

    se sim faça algo semelante a isso

    SELECT  PDF.DocFinChv AS 'Chave' ,
            PDF.MovCtrlBancNum AS 'Num_Mov' ,
            PDF.EntCod AS 'Cod_Ent' ,
            PDF.ParcDocFinEntNome AS 'Nome_Entidade' ,
            PDF.ParcDocFinTipoLanc AS 'Tipo' ,
            PDF.ParcDocFinDupNum AS 'Documento' ,
            PDF.ParcDocFinDataVenc AS 'Data_Venc' ,
            PDF.ParcDocFinDataPag AS 'Data_Pag' ,
            PDF.ParcDocFinValOrig AS 'Valor_Orig' ,
            PDF.ParcDocFinValPag AS 'Valor_Pago' ,
            PDF.ParcDocFinObs AS 'Obs.' ,
            'Dias' = DATEDIFF(DAY, PDF.ParcDocFinDataPag, PDF.ParcDocFinDataVenc)
    FROM    PARC_DOC_FIN PDF WITH ( NOLOCK )
    WHERE   
             PDF.ParcDocFinDataPag  BETWEEN '20161001'  AND     '20161028'
            AND EXISTS ( SELECT TOP 1 1
                         FROM   DOC_FIN_CLASSE_REC_DESP DFCRD WITH ( NOLOCK )
    					 JOIN PARC_DOC_FIN ON   DFCRD.PKTabela = PARC_DOC_FIN.FKTabela
                         WHERE  DFCRD.CLASSERECDESPCODESTR = '60.13.005' );

     

    Wesley Neves


    • Editado Wesley Neves sexta-feira, 28 de outubro de 2016 12:34 Correção
    sexta-feira, 28 de outubro de 2016 12:34
  • Existe somente um campo FK porém se eu usar este campo da forma descrita acima somente vai trazer o registro que vincula as duas tabelas, preciso que traga todos os registros da tabela PARC_DOC_FIN desde que na tabela DOC_FIN_CLASSE_REC_DESP esteja com a condição 60.13.005

    sexta-feira, 28 de outubro de 2016 13:05
  • 1)Me mostra uns exemplos (top 5) dos dados da tabela PARC_DOC_FIN 

    2)Me mostra uns exemplos (top 5) dos dados da tabela DOC_FIN_CLASSE_REC_DESP 


    Wesley Neves

    sexta-feira, 28 de outubro de 2016 13:18
  • Bom dia

    Wesley!

    Não existe um elo de ligação na tabela PARC_DOC_FIN com o código 60.13.005 esse código somente existe na outra tabela, porém preciso que traga todos os registros se a condição da segunda tabela for 60.13.005

    sexta-feira, 28 de outubro de 2016 13:19
  • Segue exemplo
    sexta-feira, 28 de outubro de 2016 13:27
  • Bom dia,

    Leandro, experimente deixar o Exists da seguinte forma:

              AND EXISTS 
                      (SELECT 1 FROM DOC_FIN_CLASSE_REC_DESP DFCRD  WITH(NOLOCK)
                       WHERE 
                           DFCRD.DocFinChv = PDF.DocFinChv AND
                           DFCRD.CLASSERECDESPCODESTR = '60.13.005' )

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 28 de outubro de 2016 13:38
  • Bom dia,

    Se eu vincular o campo DocFinChav ele traz somente os registros cuja condição seja 60.13.005 porém preciso caso exista essa condição traga  todos registros do lançamento da tabela PARC_DOC_FIM 

    sexta-feira, 28 de outubro de 2016 13:50
  • Então Eu desconheço qualquer forma de vc unir dois conjuntos ,se eles não tiverem um elo de ligação 

    Vc rodou a query que te passei com essa modificação

     WHERE 
                           DFCRD.DocFinChv = PDF.DocFinChv AND
                           DFCRD.CLASSERECDESPCODESTR = '60.13.005' )

    Eu acredito que seria o correto


    Wesley Neves

    sexta-feira, 28 de outubro de 2016 13:54
  • Rodei, mas traz somente onde as duas chaves forem iguais
    sexta-feira, 28 de outubro de 2016 14:00
  • Não entendi muito bem... o que você quer dizer com o trecho abaixo?

    ... "traga  todos registros do lançamento da tabela PARC_DOC_FIM"


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 28 de outubro de 2016 14:22
  • Veja isso 

    1) Nesse primeiro exemplo vc trás todos os registros da tabela PARC_DOC_FIN  que tenha o codigo  60.13.005


    SELECT  PDF.DocFinChv AS 'Chave' ,
            PDF.MovCtrlBancNum AS 'Num_Mov' ,
            PDF.EntCod AS 'Cod_Ent' ,
            PDF.ParcDocFinEntNome AS 'Nome_Entidade' ,
            PDF.ParcDocFinTipoLanc AS 'Tipo' ,
            PDF.ParcDocFinDupNum AS 'Documento' ,
            PDF.ParcDocFinDataVenc AS 'Data_Venc' ,
            PDF.ParcDocFinDataPag AS 'Data_Pag' ,
            PDF.ParcDocFinValOrig AS 'Valor_Orig' ,
            PDF.ParcDocFinValPag AS 'Valor_Pago' ,
            PDF.ParcDocFinObs AS 'Obs.' ,
            'Dias' = DATEDIFF(DAY, PDF.ParcDocFinDataPag, PDF.ParcDocFinDataVenc)
    FROM    PARC_DOC_FIN PDF WITH ( NOLOCK )
    WHERE   PDF.ParcDocFinDataPag BETWEEN '20161001'
                                  AND     '20161028'
    AND pdf.DocFinChv IN ( SELECT DFCRD.DocFinChv 
                                   FROM   DOC_FIN_CLASSE_REC_DESP DFCRD WITH ( NOLOCK )
     WHERE  DFCRD.CLASSERECDESPCODESTR = '60.13.005' );
    )


    Wesley Neves

    sexta-feira, 28 de outubro de 2016 14:25
  • Gapimex Boa tarde,

    Realmente sem o campo chave para ligar as tabelas não tem como trazer os registros corretos, resolvi mudar o código e criar uma procedure criando uma tabela temp para gerar os registros da primeira movimentação,nesta tabela temporária tem um campo MovCtrlBancNum que a partir dela consigo vincular com o segundo select, será que consegue me ajudar, se eu crio a tabela primeiro e depois faço o vinculo traz o resultado esperado mas quando faço na procedure não traz os registros, consegue identificar o que estou fazendo de errado

    abs,

    GO
    /****** Object:  StoredProcedure [dbo].[USERRel_Antecipacao]    Script Date: 10/28/2016 14:34:20 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[USERRel_Antecipacao]
    
    @DataInicial DATETIME,
    @DataFinal DATETIME
    
    AS BEGIN
    		/*Verificando se existe a table temporária global ##CarregaDados. Se existir iremos dropa-la*/
    		If exists (Select 1 From tempdb.dbo.sysobjects where id = OBJECT_ID('tempdb..[##GeraDados]'))
    		  Drop table ##GeraDados
    
       SELECT 
    		PDF.DocFinChv ,
    		PDF.MovCtrlBancNum ,
    		PDF.EntCod , 
    		PDF.ParcDocFinEntNome,
    		PDF.ParcDocFinTipoLanc,
    		PDF.ParcDocFinDupNum, 
    		PDF.ParcDocFinDataVenc,
    		PDF.ParcDocFinDataPag,
    		PDF.ParcDocFinValOrig,
    		PDF.ParcDocFinValPag,
    		PDF.ParcDocFinObs,
    		'Dias' = DATEDIFF(DAY, PDF.ParcDocFinDataPag ,PDF.ParcDocFinDataVenc)
    		
    	INTO 
    		    ##GeraDados
    		
    	FROM 
    			PARC_DOC_FIN PDF WITH(NOLOCK)
    			
    	WHERE   
    								            
              PDF.ParcDocFinDataPag BETWEEN @DataInicial AND @DataInicial 					            			            
              AND  EXISTS (SELECT * FROM DOC_FIN_CLASSE_REC_DESP DFCRD WITH(NOLOCK)
    					            WHERE DFCRD.CLASSERECDESPCODESTR = '60.13.005' And PDF.DocFinChv = DFCRD.DocFinChv )
    
      SELECT 
    		PDF1.DocFinChv  As 'Chave' ,
    		PDF1.MovCtrlBancNum As 'Num_Mov',
    		PDF1.EntCod As 'Cod_Ent', 
    		PDF1.ParcDocFinEntNome As 'Nome_Entidade',
    		PDF1.ParcDocFinTipoLanc As 'Tipo',
    		PDF1.ParcDocFinDupNum As 'Documento', 
    		PDF1.ParcDocFinDataVenc As 'Data_Venc',
    		PDF1.ParcDocFinDataPag As 'Data_Pag',
    		PDF1.ParcDocFinValOrig As 'Valor_Orig',
    		PDF1.ParcDocFinValPag As 'Valor_Pago',
    		PDF1.ParcDocFinObs As 'Obs.' ,
    		'Dias' =   DATEDIFF(DAY, PDF1.ParcDocFinDataPag ,PDF1.ParcDocFinDataVenc)
    		
      FROM 
    			PARC_DOC_FIN PDF1 WITH(NOLOCK),
    			##GeraDados WITH(NOLOCK)
    			
    			
      WHERE 
    			##GeraDados.MovCtrlBancNum = PDF1.MovCtrlBancNum
      	
    
    End

     
    sexta-feira, 28 de outubro de 2016 17:12
  • Boa tarde,

    Acho que é possível obter o resultado esperado com a query abaixo (sem a procedure):

    with CTE_PDF as
    (
        SELECT 
            PDF.MovCtrlBancNum
        FROM PARC_DOC_FIN PDF WITH(NOLOCK)
        WHERE   
            PDF.ParcDocFinDataPag BETWEEN @DataInicial AND @DataInicial AND
            EXISTS 
                (SELECT * FROM DOC_FIN_CLASSE_REC_DESP DFCRD WITH(NOLOCK)
                 WHERE 
                     DFCRD.CLASSERECDESPCODESTR = '60.13.005' And 
                     PDF.DocFinChv = DFCRD.DocFinChv)
    )
    
    SELECT 
        PDF1.DocFinChv  As 'Chave' ,
        PDF1.MovCtrlBancNum As 'Num_Mov',
        PDF1.EntCod As 'Cod_Ent', 
        PDF1.ParcDocFinEntNome As 'Nome_Entidade',
        PDF1.ParcDocFinTipoLanc As 'Tipo',
        PDF1.ParcDocFinDupNum As 'Documento', 
        PDF1.ParcDocFinDataVenc As 'Data_Venc',
        PDF1.ParcDocFinDataPag As 'Data_Pag',
        PDF1.ParcDocFinValOrig As 'Valor_Orig',
        PDF1.ParcDocFinValPag As 'Valor_Pago',
        PDF1.ParcDocFinObs As 'Obs.' ,
        'Dias' =   DATEDIFF(DAY, PDF1.ParcDocFinDataPag ,PDF1.ParcDocFinDataVenc)
    FROM CTE_PDF as PDF
    INNER JOIN PARC_DOC_FIN PDF1 WITH(NOLOCK)
        ON PDF1.MovCtrlBancNum = PDF.MovCtrlBancNum

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 28 de outubro de 2016 18:21
  • Bom dia,

    Obrigado!

    Desta forma resolve o problema, 

    abs,

    segunda-feira, 31 de outubro de 2016 09:49