none
Subquery RRS feed

  • Pergunta

  • Boa Tarde Pessoal,

    Estou precisando unir 2 query, acredito que se fizer uma subquery possa resolver meu problema so que, não sei como fazer, alguem poderia me ajudar.

    Segue abaixo as 2 query;

    1ª Query

    SELECT 
    ZR_NUM,ZR_EMISSAO,ZR_CLI,ZR_LOJA,ZR_NOTA,ZS_COD,A2_NREDUZ,A2_LOJA,UD_QTDE,UD_QTDEREC,UD_CODIGO,(UD_QTDE -UD_QTDEREC) AS DIV,B.ZS_FORNECE AS FORNECEDOR,B.ZS_STATUS AS STATUSG,F.UA6_DESC,ZS_DVISTEC,ZS_VISITEC,ZS_ORCVFIL,ZS_FILVGAR,ZS_DSMFGAR,ZS_DEMFGAR,ZS_ORCVGAR,ZS_DSMGFIL,ZS_DEMFIL,ZS_DSAICLI,ZS_ORCCLI,ZS_NFSACLI,B.ZS_LOJA
       
     
    FROM 
    SZR010 A 
    LEFT OUTER JOIN 
    SZS010 B ON B.D_E_L_E_T_ = ' ' 
    AND B.ZS_FILIAL = A.ZR_FILIAL 
    AND B.ZS_NUM = A.ZR_NUM 
    LEFT OUTER JOIN 
    SUD010 D ON D.D_E_L_E_T_ = ' ' 
    AND D.UD_PRODUTO = B.ZS_COD 
    AND D.UD_NUMGAR = A.ZR_NUM 
    AND D.UD_FILORI = A.ZR_FILIAL 
    AND B.ZS_ITEM = D.UD_ITEMGAR 
    LEFT OUTER JOIN 
    SA2010 E ON E.D_E_L_E_T_ = ' ' 
    AND E.A2_COD = B.ZS_FORNECE 
    AND E.A2_LOJA = B.ZS_LOJA 
    AND E.A2_FILIAL = B.ZS_FILIAL 
    LEFT OUTER JOIN 
    UA6010 F ON F.UA6_COD = D.UD_CODDEF 
    AND F.UA6_FORNEC = D.UD_FORN 
    AND F.D_E_L_E_T_ = ' ' 
    LEFT OUTER JOIN 
    SB1010 G ON G.D_E_L_E_T_ = ' ' 
    AND G.B1_FILIAL = B.ZS_FILIAL 
    AND G.B1_COD = B.ZS_COD 

    LEFT OUTER JOIN 
    SD1010 SD1 ON SD1.D_E_L_E_T_ = ' ' 
        AND SD1.D1_FILIAL IN ('30') 
    AND SD1.D_E_L_E_T_<>'*' 
    AND SD1.D1_COD = 'RHO411         ' 
    AND SD1.D1_TES<>' ' 
    AND SD1.D1_FORNECE = '000065' 
    AND SD1.D1_LOJA = '01' 
    AND SD1.D1_EMISSAO <='20200218'
    AND SD1.D1_SERIE NOT IN ('UNT','UN3','DPL') 
    AND SD1.D1_TIPO = 'N' 
    AND SD1.D1_FORMUL <> 'S' 
    AND SD1.D1_CF NOT IN ('1152','2152','1949','2949','1409','2409') 
    AND SD1.D1_TES NOT IN ('037','034','035','039','029','041') 

    WHERE  
    A.D_E_L_E_T_ = ' ' 
    AND A.ZR_FILIAL IN ('40') 
    AND A.ZR_NUM BETWEEN '      ' AND 'ZZZZZZ' 
    AND A.ZR_EMISSAO BETWEEN '20190219' AND '20200219' 
    AND B.ZS_FORNECE BETWEEN '      ' AND 'ZZZZZZ' 
    AND B.ZS_NFIND = ' ' 
    AND B.ZS_STATUS NOT IN ('R','I','E')  
    ORDER BY  
     A2_NREDUZ, A2_LOJA, B1_GRUPO1, ZR_NUM, ZS_COD 


    2ª Query, nesta eu preciso apenas do campo D1_DOC dentro da primeira query
    SELECT  TOP 1 MAX (D1_EMISSAO) AS DTAEMISSAO ,D1_DOC
       
    FROM 
    SD1010 SD1 
    LEFT JOIN 
    SZV010 SZV ON SZV.D_E_L_E_T_ = ' ' 
    AND ZV_NFORI = D1_DOC 
    AND ZV_COD = D1_COD 
    WHERE  

    D1_FILIAL IN ('30') 
    AND SD1.D_E_L_E_T_<>'*' 
    AND D1_COD = 'RHO411         ' 
    AND D1_TES<>' ' 
    AND D1_FORNECE = '000065' 
    AND D1_LOJA = '01' 
    AND D1_EMISSAO <='20200218'
    AND D1_SERIE NOT IN ('UNT','UN3','DPL') 
    AND D1_TIPO = 'N' 
    AND D1_FORMUL <> 'S' 
    AND D1_CF NOT IN ('1152','2152','1949','2949','1409','2409') 
    AND D1_TES NOT IN ('037','034','035','039','029','041') 
    GROUP BY 
    D1_COD, D1_UM, D1_VUNIT, D1_EMISSAO, D1_DOC, D1_SERIE, D1_IPI, D1_PICM, D1_EMP, D1_ITEM, D1_QUANT, D1_QTDEDEV 
    HAVING 
    D1_QUANT-SUM(CASE WHEN ZV_QTD IS NULL THEN 0 ELSE ZV_QTD END) > 0 AND (D1_QUANT - D1_QTDEDEV) > 0  
    ORDER BY  
    D1_EMISSAO DESC 

    quarta-feira, 19 de fevereiro de 2020 19:54

Todas as Respostas

  • Deleted
    quarta-feira, 19 de fevereiro de 2020 20:08
  • Esqueci de mencionar que Fornecedor da primeira query tem que existir na segunda para que a informação fique correta.
    quarta-feira, 19 de fevereiro de 2020 20:42
  • A segunda query nao precisa do group by e nem do order by
    quarta-feira, 19 de fevereiro de 2020 20:43
  • Wanderson,

    Aparentemente você esta utilizando uma base de dados Microsiga ou Protheus!!!

    Independente disso, de qual versão do SQL Server você esta implementando este código?

    Tenho algumas dúvidas:

    1 - O que exatamente cada query deverá processar e retornar em tela?

    2 - Quando você se refere a Unir, esta querendo dizer estabelecer uma junção entre os dois Select ou propriamente fazer uso do operador Union?

    Talvez podemos pensar em transformar estas duas querys em duas CTEs e estabelecer uma relação entre elas, algo similar a este exemplo:

    ;With CTEQuery1
    As
    (SELECT 
    ZR_NUM,ZR_EMISSAO,ZR_CLI,ZR_LOJA,ZR_NOTA,ZS_COD,A2_NREDUZ,A2_LOJA,UD_QTDE,UD_QTDEREC,UD_CODIGO,(UD_QTDE -UD_QTDEREC) AS DIV,B.ZS_FORNECE AS FORNECEDOR,B.ZS_STATUS AS STATUSG,F.UA6_DESC,ZS_DVISTEC,ZS_VISITEC,ZS_ORCVFIL,ZS_FILVGAR,ZS_DSMFGAR,ZS_DEMFGAR,ZS_ORCVGAR,ZS_DSMGFIL,ZS_DEMFIL,ZS_DSAICLI,ZS_ORCCLI,ZS_NFSACLI,B.ZS_LOJA
        
     
    FROM 
    SZR010 A 
    LEFT OUTER JOIN 
    SZS010 B ON B.D_E_L_E_T_ = ' ' 
    AND B.ZS_FILIAL = A.ZR_FILIAL 
    AND B.ZS_NUM = A.ZR_NUM 
    LEFT OUTER JOIN 
    SUD010 D ON D.D_E_L_E_T_ = ' ' 
    AND D.UD_PRODUTO = B.ZS_COD 
    AND D.UD_NUMGAR = A.ZR_NUM 
    AND D.UD_FILORI = A.ZR_FILIAL 
    AND B.ZS_ITEM = D.UD_ITEMGAR 
    LEFT OUTER JOIN 
    SA2010 E ON E.D_E_L_E_T_ = ' ' 
    AND E.A2_COD = B.ZS_FORNECE 
    AND E.A2_LOJA = B.ZS_LOJA 
    AND E.A2_FILIAL = B.ZS_FILIAL 
    LEFT OUTER JOIN 
    UA6010 F ON F.UA6_COD = D.UD_CODDEF 
    AND F.UA6_FORNEC = D.UD_FORN 
    AND F.D_E_L_E_T_ = ' ' 
    LEFT OUTER JOIN 
    SB1010 G ON G.D_E_L_E_T_ = ' ' 
    AND G.B1_FILIAL = B.ZS_FILIAL 
    AND G.B1_COD = B.ZS_COD 
    
    LEFT OUTER JOIN 
    SD1010 SD1 ON SD1.D_E_L_E_T_ = ' ' 
        AND SD1.D1_FILIAL IN ('30') 
    AND SD1.D_E_L_E_T_<>'*' 
    AND SD1.D1_COD = 'RHO411         ' 
    AND SD1.D1_TES<>' ' 
    AND SD1.D1_FORNECE = '000065' 
    AND SD1.D1_LOJA = '01' 
    AND SD1.D1_EMISSAO <='20200218'
    AND SD1.D1_SERIE NOT IN ('UNT','UN3','DPL') 
    AND SD1.D1_TIPO = 'N' 
    AND SD1.D1_FORMUL <> 'S' 
    AND SD1.D1_CF NOT IN ('1152','2152','1949','2949','1409','2409') 
    AND SD1.D1_TES NOT IN ('037','034','035','039','029','041') 
    
    WHERE  
    A.D_E_L_E_T_ = ' ' 
    AND A.ZR_FILIAL IN ('40') 
    AND A.ZR_NUM BETWEEN '      ' AND 'ZZZZZZ' 
    AND A.ZR_EMISSAO BETWEEN '20190219' AND '20200219' 
    AND B.ZS_FORNECE BETWEEN '      ' AND 'ZZZZZZ' 
    AND B.ZS_NFIND = ' ' 
    AND B.ZS_STATUS NOT IN ('R','I','E')
    ),
    CTEQuery2 
    As
    (SELECT  TOP 1 MAX (D1_EMISSAO) AS DTAEMISSAO ,D1_DOC
        
    FROM 
    SD1010 SD1 
    LEFT JOIN 
    SZV010 SZV ON SZV.D_E_L_E_T_ = ' ' 
    AND ZV_NFORI = D1_DOC 
    AND ZV_COD = D1_COD 
    WHERE  
    
    D1_FILIAL IN ('30') 
    AND SD1.D_E_L_E_T_<>'*' 
    AND D1_COD = 'RHO411         ' 
    AND D1_TES<>' ' 
    AND D1_FORNECE = '000065' 
    AND D1_LOJA = '01' 
    AND D1_EMISSAO <='20200218'
    AND D1_SERIE NOT IN ('UNT','UN3','DPL') 
    AND D1_TIPO = 'N' 
    AND D1_FORMUL <> 'S' 
    AND D1_CF NOT IN ('1152','2152','1949','2949','1409','2409') 
    AND D1_TES NOT IN ('037','034','035','039','029','041'))
    
    Select C1.*, C2.* From CTEQueyr1 C1 Inner Join CTEQuery2 C2
    				     On C1.... = C2.....
    Where .....
    Order By .....

    Você destacou que o Fornecedor da Query1 tem que existir na Query2, este pode ser o elemento que vai estabelecer a junção e condição entre estas querys.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 19 de fevereiro de 2020 22:52
  • Deleted
    quinta-feira, 20 de fevereiro de 2020 11:47