Usuário com melhor resposta
Consulta Union All

Pergunta
-
Boa noite Galera!!
Minha Pergunta é a seguinte na segunda consulta no WHERE tenho uma clausula "AND NOTA1.IDPESS = NOTA.IDPESS", onde NOTA.IDPESS preciso que pegue a informação da primeira consulta, nao sei se isso é possivel e se for como ficariaSELECT UNIQUE
'Expedição' AS TIPO,
NOTAEXPEDICAO.ESTAB,
NOTA.SERIE || ' - ' || NOTA.NUMDOC AS NUMDOC,
NOTA.IDPESS,
P.NOME,
PV.NOME AS VENDEDOR,
TO_NUMBER(NOTAITEM.IDITEM) IDITEM,
ITEM.DESCRICAO,
MARCA.DESCRICAO MARCA,
TRUNC(NOTAITEMCP.DTPREVENTEXP) AS DTPREVENTEXP,
NOTAITEM.QUANTIDADE QTDEVENDIDA,
CASE
WHEN NL.QUANTIDADE IS NULL THEN
NOTAITEM.QUANTIDADE
ELSE NL.QUANTIDADE END AS TESTE,
NL.LOTE,
NOTAEXPEDICAO.QTDEENTREGA - COALESCE(GETTOTALCONTROLEEXP(NOTAEXPEDICAO.ESTAB,
NOTAEXPEDICAO.IDNOTA,
NOTAEXPEDICAO.SEQITEM),0) QTDEENTREGA
FROM NOTAEXPEDICAO
LEFT JOIN NOTAITEM
ON (NOTAITEM.ESTAB = NOTAEXPEDICAO.ESTAB)
AND (NOTAITEM.IDNOTA = NOTAEXPEDICAO.IDNOTA)
AND (NOTAITEM.SEQITEM = NOTAEXPEDICAO.SEQITEM)
LEFT JOIN EMBALAGEM EMB
ON EMB.IDEMBALAGEM = NOTAITEM.IDEMBALAGEM
LEFT JOIN NOTA
ON (NOTA.ESTAB = NOTAEXPEDICAO.ESTAB)
AND (NOTA.IDNOTA = NOTAEXPEDICAO.IDNOTA)
LEFT JOIN NOTAITEMCP
ON (NOTAITEMCP.ESTAB = NOTAEXPEDICAO.ESTAB)
AND (NOTAITEMCP.IDNOTA = NOTAEXPEDICAO.IDNOTA)
AND (NOTAITEMCP.SEQITEM = NOTAEXPEDICAO.SEQITEM)
LEFT JOIN ITEMESTAB
ON (ITEMESTAB.ESTAB = NOTAITEM.ESTAB)
AND (ITEMESTAB.IDITEM = NOTAITEM.IDITEM)
LEFT JOIN ITEM
ON (ITEM.ESTAB = ITEMESTAB.ESTABITEM)
AND (ITEM.IDITEM = ITEMESTAB.IDITEM)
LEFT JOIN ITEMCATEGORIA IC
ON (IC.ESTAB = ITEM.ESTAB)
AND (IC.IDITEM = ITEM.IDITEM)
LEFT JOIN MARCA
ON (MARCA.IDMARCA = IC.IDMARCA)
LEFT JOIN V_SIMPLEPESS P
ON (P.IDPESS = NOTA.IDPESS)
LEFT JOIN PESSOA PV
ON PV.IDPESSOA = NOTAITEM.IDVENDEDOR
/*LEFT JOIN V_SIMPLEPESS V
ON (V.IDPESS = NOTAITEM.IDVENDEDOR)*/
LEFT JOIN LOCALRETIRADA
ON (LOCALRETIRADA.ESTAB = NOTAEXPEDICAO.ESTABBX)
AND (LOCALRETIRADA.IDLOCALRETIRADA = NOTAEXPEDICAO.IDLOCALENTREGA)
LEFT JOIN NOTALOTE NL
ON (NL.IDNOTA = NOTAITEM.IDNOTA
AND NL.IDITEM = NOTAITEM.IDITEM
AND NL.SEQITEM = NOTAITEM.SEQITEM)
WHERE
--(0 = :SQL)
--IC.IDMARCA = 6
TRUNC(NOTAITEMCP.DTPREVENTEXP) = :DTINI
AND (NOTA.IDNOTACONF IN(200,201,206,224))
AND (LOCALRETIRADA.EXPEDICAO = 'S') AND (LOCALRETIRADA.RETIRA = 'N') AND (LOCALRETIRADA.IDLOCALRETIRADA <> 10)
AND (COALESCE(NOTAEXPEDICAO.QTDEENTREGA,0) - COALESCE(GETTOTALCONTROLEEXP(NOTAEXPEDICAO.ESTAB,
NOTAEXPEDICAO.IDNOTA,
NOTAEXPEDICAO.SEQITEM),0) > 0)
UNION ALL
SELECT UNIQUE
'Ent. Imediata' AS TIPO,
NOTAEXPEDICAO.ESTAB,
NOTA1.SERIE || ' - ' || NOTA1.NUMDOC AS NUMDOC,
NOTA1.IDPESS,
P.NOME,
PV.NOME AS VENDEDOR,
TO_NUMBER(NOTAITEM.IDITEM) IDITEM,
ITEM.DESCRICAO,
MARCA.DESCRICAO MARCA,
TRUNC(NOTA1.EMISSAO) AS DTPREVENTEXP,
NOTAITEM.QUANTIDADE QTDEVENDIDA,
CASE
WHEN NL.QUANTIDADE IS NULL THEN
NOTAITEM.QUANTIDADE
ELSE NL.QUANTIDADE END AS TESTE,
NL.LOTE,
NOTAEXPEDICAO.QTDERETIRA AS QTDEENTREGA
FROM NOTAEXPEDICAO
LEFT JOIN NOTAITEM
ON (NOTAITEM.ESTAB = NOTAEXPEDICAO.ESTAB)
AND (NOTAITEM.IDNOTA = NOTAEXPEDICAO.IDNOTA)
AND (NOTAITEM.SEQITEM = NOTAEXPEDICAO.SEQITEM)
LEFT JOIN EMBALAGEM EMB
ON EMB.IDEMBALAGEM = NOTAITEM.IDEMBALAGEM
LEFT JOIN NOTA NOTA1
ON (NOTA1.ESTAB = NOTAEXPEDICAO.ESTAB)
AND (NOTA1.IDNOTA = NOTAEXPEDICAO.IDNOTA)
LEFT JOIN NOTAITEMCP
ON (NOTAITEMCP.ESTAB = NOTAEXPEDICAO.ESTAB)
AND (NOTAITEMCP.IDNOTA = NOTAEXPEDICAO.IDNOTA)
AND (NOTAITEMCP.SEQITEM = NOTAEXPEDICAO.SEQITEM)
LEFT JOIN ITEMESTAB
ON (ITEMESTAB.ESTAB = NOTAITEM.ESTAB)
AND (ITEMESTAB.IDITEM = NOTAITEM.IDITEM)
LEFT JOIN ITEM
ON (ITEM.ESTAB = ITEMESTAB.ESTABITEM)
AND (ITEM.IDITEM = ITEMESTAB.IDITEM)
LEFT JOIN ITEMCATEGORIA IC
ON (IC.ESTAB = ITEM.ESTAB)
AND (IC.IDITEM = ITEM.IDITEM)
LEFT JOIN MARCA
ON (MARCA.IDMARCA = IC.IDMARCA)
LEFT JOIN V_SIMPLEPESS P
ON (P.IDPESS = NOTA1.IDPESS)
LEFT JOIN PESSOA PV
ON PV.IDPESSOA = NOTAITEM.IDVENDEDOR
/*LEFT JOIN V_SIMPLEPESS V
ON (V.IDPESS = NOTAITEM.IDVENDEDOR)*/
LEFT JOIN LOCALRETIRADA
ON (LOCALRETIRADA.ESTAB = NOTAEXPEDICAO.ESTABBX)
AND (LOCALRETIRADA.IDLOCALRETIRADA = NOTAEXPEDICAO.IDLOCALENTREGA)
LEFT JOIN NOTALOTE NL
ON (NL.IDNOTA = NOTAITEM.IDNOTA
AND NL.IDITEM = NOTAITEM.IDITEM
AND NL.SEQITEM = NOTAITEM.SEQITEM)
WHERE
--(0 = :SQL)
--IC.IDMARCA = 6
TRUNC(NOTAITEMCP.DTPREVENTEXP) <> :DTINI
AND NOTA1.IDPESS = NOTA.IDPESS
AND (NOTA1.IDNOTACONF IN(200,201,206,224))
AND (LOCALRETIRADA.EXPEDICAO = 'S') AND (LOCALRETIRADA.RETIRA = 'N') AND (LOCALRETIRADA.IDLOCALRETIRADA <> 10)
AND (COALESCE(NOTAEXPEDICAO.QTDEENTREGA,0) - COALESCE(GETTOTALCONTROLEEXP(NOTAEXPEDICAO.ESTAB,
NOTAEXPEDICAO.IDNOTA,
NOTAEXPEDICAO.SEQITEM),0) > 0)
Respostas
-
Boa Noite,
Com o operador UNION não é possível fazer o que você está querendo, pelo menos não da forma que você construiu. O Union só faz a junção de dois conjuntos. Você pode usar o comando EXISTS ou ainda o uma CTE pois você quer comparar um primeiro conjunto com um segundo, nesse caso pode ser um EXISTS tal informação do conjunto um no conjunto dois. Com as CTEs você compara um subconjunto com outro, ou seja, a diferença é que na CTE você pode ter várias CTE na mesma consulta.
Veja nos links se lhe ajuda:
EXISTS
https://technet.microsoft.com/pt-br/library/ms189259(v=sql.105).aspx
CTE
https://technet.microsoft.com/pt-br/library/ms190766(v=sql.105).aspx
Rodrigo Dornel | MCT, MCSA & MTAC | Chapter Leader
- Marcado como Resposta Marcos SJ terça-feira, 6 de outubro de 2015 17:38