none
Consulta Union All RRS feed

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

    SELECT 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)

    sexta-feira, 2 de outubro de 2015 21:03

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
    sexta-feira, 2 de outubro de 2015 23:21