# Subquery

• ### 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