Pular para o conteúdo

Fóruns SQL e PL/SQL SQL com muitos joins SQL com muitos joins

#98549
ronaldobim
Participante

    Olá, segue o SQL, este SQL não dá o problema pois foi tirado um ou dois left e fiz outro pequeno select.

    SELECT
    — DADOS DA NF
    CASE
    WHEN ASCII(NFCFG.ENTRADASAIDA) = 83 THEN 1
    WHEN ASCII(NFCFG.ENTRADASAIDA) = 69 THEN 2
    END AS ENTSAI,
    NFCFG.DESCRICAO AS DESCNFCFG,
    NFCFG.CASASDECUNIT, NFCFG.CASASDECUNITDANFE,
    NFCFG.IMPDESCTOSEP, NFCFG.IMPRECIBFIX,
    NFCFG.GRUPOFAMILIAR,
    NFCFG.ENTRADASAIDA,
    NFCFG.NATUREZADAOPERACAO,

    NFCAB.EMITENFE AS TIPOEMISSAO,
    NFCAB.ESTAB AS EMPRESA,
    NFCAB.ESTAB, NFCAB.SEQNOTA,
    –O campo ESTAB_SEQNOTA é utilizado para quebra de grupos no ReportBuilder
    NFCAB.ESTAB || CHR(45) || NFCAB.SEQNOTA AS ESTAB_SEQNOTA,
    NFCAB.SERIE || CHR(45) || NFCAB.NOTA AS NRONF,
    NFCAB.CHAVEACESSONFE,
    NFCAB.SERIE,
    NFCAB.NOTA AS NUMERO,
    NFCAB.NPROTAUTORIZA,
    NFCAB.DTAUTORIZANFE,
    NFCAB.VLRIMPNFANT,
    NFCAB.SAFRA AS SAFRA_CAB,
    CFOP.NOME AS DESCCFOP,
    CONFDANFE.REFCOMP AS CONFDANFE_REFCOMP,
    CONFDANFE.IMPLOTE AS CONFDANFE_IMPLOTE,
    CONFDANFE.LOGO AS CONFDANFE_LOGO,
    CONFDANFE.IMPENDEMIT AS CONFDANFE_IMPENDEMIT,
    CONFDANFE.NATOPER AS CONFDANFE_NATOPER,
    CONFDANFE.VALORTOTAL AS CONFDANFE_VALORTOTAL,
    CONFDANFE.IMPPH AS CONFDANFE_IMPPH,
    CONFDANFE.IMPSAFRA AS CONFDANFE_IMPSAFRA,
    CONFDANFE.MSGCONTRATO AS CONFDANFE_MSGCONTRATO,
    CONFDANFE.VLRTOTPROD AS CONFDANFE_VLRTOTPROD,
    CONFDANFE.DOCPEND,
    CONFDANFE.IMPLGLOTE,
    CONFDANFE.IMPLGVALIDADE,
    CONFDANFE.IMPLGFABRICANTE,
    CONFDANFE.IMPLGREGISTROFAB,
    CONFDANFE.IMPLGQUANTIDADE,
    CONFDANFE.IMPLGPESO,
    CONFDANFE.IMPLGREGISTROPROD,
    CONFDANFE.IMPLSLOTE,
    CONFDANFE.IMPLSGERMINACAO,
    CONFDANFE.IMPLSATESTADO,
    CONFDANFE.IMPLSPUREZA,
    CONFDANFE.IMPLSVARIEDADE,
    CONFDANFE.IMPLSPENEIRA,
    CONFDANFE.IMPLSVALIDADE,
    CONFDANFE.IMPLSCATEGORIA,
    CONFDANFE.IMPLSSAFRA,
    CONFDANFE.IMPLSESPECIE,
    CONFDANFE.IMPLSCULTIVAR,
    CONFDANFE.IMPLSQUANTIDADE,
    CONFDANFE.IMPLSPESO,
    CONFDANFE.IMPLSNOMEPROD,
    CONFDANFE.IMPLSRENASEM,
    CONFDANFE.IMPLSBOLETIM,
    CONFDANFE.IMPLSPMS,
    CONFDANFE.IMPLVLOTE,
    CONFDANFE.IMPLVMESFAB,
    CONFDANFE.IMPLVANOFAB,
    CONFDANFE.IMPLVVALIDADE,
    CONFDANFE.IMPLVFABRICANTE,
    CONFDANFE.IMPLVQUANTIDADE,
    CONFDANFE.IMPLDLOTE,
    CONFDANFE.IMPLDDATAVALIDADE,
    CONFDANFE.IMPLDDATAFABRICACAO,
    CONFDANFE.IMPLDQUANTIDADE,
    CONFDANFE.IMPNROPED,
    CONFDANFE.IMPREPRE,
    CONFDANFE.IMPUSER,
    CONFDANFE.DADOSEMIT,
    CONFDANFE.IMPREPRENOME,
    PREPRESE.DESCRICAO AS NOMEREPRESENT,
    NFCFG.NACIMPEXP,
    NFCAB.EXPNCM,
    NFCAB.EXPRE,
    NFCAB.EXPVLRFOB,
    NFCAB.EXPTXDOLAR,
    NFCAB.EXPNAVIO,
    NFCAB.EXPDESCITEM,
    NFCAB.EXPEMBALAGEM,
    NFCAB.USERID,

    /* DADOS DO EMITENTE */
    EMI.CGC AS CNPJEMI,
    EMI.NOME AS NOMEEMI,
    EMI.FANTASIA AS FANTASIAEMI,
    EMI.NOME AS RAZAOSOCIALEMI,
    EMI.ENDERECO AS ENDERECOEMI,
    EMI.BAIRRO AS BAIRROEMI,
    EMI.NUMERO AS NUMEROEMI,
    EMI.COMPLEMENT AS COMPLEMENTOEMI,
    CIDEMI.NOME AS NOMECIDADEEMI,
    CIDEMI.UF AS UFEMI,
    EMI.TELEFONE AS TELEMI,
    EMI.FAX AS FAXEMI,
    EMI.CEP AS CEPEMI,
    EMI.INSCESTAD AS INSESTADEMI,
    EMI.LOGOTIPO,

    — DADOS DO DESTINATÁRIO
    DEST.NOME || CHR(45) || DEST.NUMEROCM AS NOMECLI,
    DEST.CNPJF AS CNPJCLI,
    COALESCE(END_ALTERNATIVO.ENDERECO, DEST.ENDERECO) AS ENDERECOCLI,
    COALESCE(END_ALTERNATIVO.BAIRRO, DEST.BAIRRO) AS BAIRROCLI,
    COALESCE(END_ALTERNATIVO.CEP, DEST.CEP) AS CEPCLI,
    COALESCE(CID_END_ALTERNATIVO.NOME, CIDDEST.NOME) AS NOMECIDADECLI,
    COALESCE(END_ALTERNATIVO.TELEFONE, DEST.TELEFONE) AS TELCLI,
    COALESCE(CID_END_ALTERNATIVO.UF, CIDDEST.UF) AS UFCLI,
    COALESCE(UF_END_ALTERNATIVO.CODIGO, UFDEST.CODIGO) AS CUF,
    COALESCE(END_ALTERNATIVO.NUMEROEND, DEST.NUMEROEND) AS NUMEROENDCLI,
    CASE
    WHEN DEST.SEXO CHR(74) THEN COALESCE(END_ALTERNATIVO.CREDENCIALAGRO, DEST.CREDENCIALAGRO)
    ELSE COALESCE(END_ALTERNATIVO.CREDENCIALAGRO, DEST.INSCESTAD)
    END AS INSCESTADCLI,

    NFCAB.DTEMISSAO,
    NFCAB.DTENTSAI AS DTSAIDA,
    NFITEM.HORA AS HRSAIDA,

    — TOTAIS DOS IMPOSTOS
    ICMS.BASETRIBUTADA AS BASEICMS,
    ICMS.VALORIMPOSTO AS VLRICMS,
    ICMS.BASEST AS BASEICMSSU,
    ICMS.VALORSUBSTITUICAO AS VLRICMSSUB,

    NFFRETE.VALORFRETE AS FRETE,
    NFFRETE.VALORSEGURO AS SEGURO,
    NFFRETE.FRETEBASE,
    NFFRETE.FRETEICMS,

    COALESCE(NFDESC.VALORDESCONTO, 0) + COALESCE(NFDESC.VALORDESCONTOMAOOBRA, 0) AS DESCONTOS,
    COALESCE(NFCAB.DESPACESSORIA,0) + COALESCE(NFCAB.OUTROSACRESC,0) AS OUTROS,
    NFDESC.IMPOSTODESC, NFDESC.IMPOSTODESCNOME, NFDESC.IMPOSTODESCTOTNF,
    NFDESC.IMPOSTODESCNOMETOTNF,
    NFDESC.IMPOSTONAOINCTOTFINN, NFDESC.IMPOSTONAOINCNOMETOT,

    /* Utilizado em um PegaCampo no OnPrint da variavel vVlrIPI – Lentidão no Oracle
    IPI.VALORIMPOSTO AS VLRIPI,*/
    CONFAGROE.IMPOSTOIPI,

    — DADOS DO FRETE
    COALESCE(NFTRANSP.NOMEINFORMADO, PRESTADOR.NOME) AS NOMEPRE,
    CASE NFTRANSP.FRETEPORCONTA WHEN CHR(69) THEN 1 ELSE 2 END AS FRETEPORCONTA,
    NFTRANSP.PLACA AS VEICULO,
    NFTRANSP.UFPLACA AS UFVEICULO,
    CASE
    WHEN (NFTRANSP.CPF IS NOT NULL) AND (NFTRANSP.CPF CHR(32)) THEN NFTRANSP.CPF
    WHEN (NFTRANSP.CGC IS NOT NULL) AND (NFTRANSP.CGC CHR(32)) THEN NFTRANSP.CGC
    ELSE PRESTADOR.CNPJF
    END AS CNPJPRE,
    COALESCE(NFTRANSP.ENDERECO, PRESTADOR.ENDERECO) AS ENDERECOPRE,
    COALESCE(CIDNFTRANSP.NOME, CIDPRE.NOME) AS NOMECIDADEPRE,
    COALESCE(CIDNFTRANSP.UF, CIDPRE.UF) AS UFPRE,
    CASE
    WHEN (NFTRANSP.INSCPRODUTOR IS NOT NULL) AND (NFTRANSP.INSCPRODUTOR CHR(32)) THEN NFTRANSP.INSCPRODUTOR
    WHEN (NFTRANSP.INSCESTAD IS NOT NULL) AND (NFTRANSP.INSCESTAD CHR(32)) THEN NFTRANSP.INSCESTAD
    WHEN (PRESTADOR.CREDENCIALAGRO IS NOT NULL) AND (PRESTADOR.CREDENCIALAGRO CHR(32)) THEN PRESTADOR.CREDENCIALAGRO
    ELSE PRESTADOR.INSCESTAD
    END AS INSCESTADPRE,
    NFTRANSP.QUANTIDADE AS QTDTRANSP,
    NFTRANSP.ESPECIE AS ESPECIETRANSP,
    NFTRANSP.MARCA AS MARCATRANSP,
    NFTRANSP.PESOBRUTO AS PESOBRUTOTRANSP,
    NFTRANSP.PESOLIQUIDO AS PESOLIQUIDTRANSP,
    NFMSG.MENSAGEM, NFMSG.MSGTRIB, NFCAB.OBSFISCALGER, NFMSG.MSGFISCO,
    NFCAB.RECID_RESERVADO, NFCAB.RECID_RESERVADO2, NFMSGCAD.MSG,
    COALESCE(NFCAB.VALORPROD, 0) – COALESCE(NFCAB.VLRNFANT, 0) AS TOTPRODUTOS,
    NFCAB.VALOR,
    COALESCE(NFCAB.VALORPRODBRUTO,
    (COALESCE(NFCAB.VALORPROD,0) – COALESCE(NFCAB.VLRNFANT,0) –
    COALESCE(NFDESC.VALORDESCONTO, 0))) AS VALORPRODBRUTO,
    NFCAB.VLRNFANT,

    /DADOS DOS PRODUTOS/
    NFITEM.ITEM,
    ITEMAGRO.DESCRICAO,
    ITEMAGRO.LOTECTRL,
    PCLASFIS.NCM AS NBMSH,
    NFITEMIMPOSTO_ICMS.CST,
    NFITEM.CFOP AS CFOP,
    ITEMAGRO.UNIDADE,
    NFITEM.QUANTIDADE,
    NFITEM.SEQNOTAITEM,
    NFITEM.EMBALAGEM,
    NFITEM.BONIFICACAO,
    NFITEM.VALORUNITARIO,

    CASE
    WHEN COALESCE(CONFDANFE.VLRUNILIQ, CHR(78)) = CHR(83) THEN

      CASE WHEN NFITEM.QUANTIDADE = 0 THEN
        ROUND(NFITEM.VALORTOTAL, NFCFG.CASASDECUNITDANFE)
      ELSE
        ROUND((NFITEM.VALORTOTAL / NFITEM.QUANTIDADE), NFCFG.CASASDECUNITDANFE)
      END
    
    ELSE
    
      CASE WHEN NFITEM.QUANTIDADE = 0 THEN
        ROUND(COALESCE(NFITEM.VALORUNITARIO, NFITEM.VALORTOTAL+COALESCE(NFITEM.DESCTOTAL,0)),
          NFCFG.CASASDECUNITDANFE)
      ELSE
        ROUND(COALESCE(NFITEM.VALORUNITARIO, NFITEM.VALORTOTAL+COALESCE(NFITEM.DESCTOTAL,0) / NFITEM.QUANTIDADE),
          NFCFG.CASASDECUNITDANFE)
      END
    

    END AS VLRUNIT,
    NFITEM.VALORTOTAL AS VLRTOTAL,
    NFITEMIMPOSTO_ICMS.BASETRIBUTADA AS BASEICMS_ITEM,
    NFITEMIMPOSTO_ICMS.VALORIMPOSTO AS VLRICMS_ITEM,
    NFITEMIMPOSTO_ICMS.ALIQUOTA AS ALIQICMS_ITEM,
    NFITEMIMPOSTO_IPI.VALORIMPOSTO AS VALORIPI_ITEM,
    NFITEMIMPOSTO_IPI.ALIQUOTA AS ALIQIPI_ITEM,
    NFITEM.COMPLEMENTO, ITEMAGRO.REFERENCIA, NFITEM.PH,
    SAFRA_ITEM.DTINICIAL AS SAFRAITEM_INICIO,
    NFITEM.RENDARROZGRAOINT, NFITEM.RENDARROZGRAOQUE,
    NFITEM.RENDARROZCASCA, NFITEM.RENDARROZFARELO,
    CONFDANFE.DESCUNI, NFITEM.DESCTOTAL,
    LEPRECOPESSOA.MSGNF AS LEPRECOPESSOA_MSGNF,
    NFCABTXARM.DESCNOME, NFCABTXARM.DESCVALOR, NFCAB.REPRESENT,
    NFCAB.NOTACONF, NFCAB.NUMEROCM, NFCFG.PESFINORIGFIXTRANSF ,
    NFCFG.IMPRIMEPRECOEBONIFICACAO

    FROM NFCAB

    LEFT JOIN NFITEM
    ON (NFITEM.ESTAB = NFCAB.ESTAB)
    AND (NFITEM.SEQNOTA = NFCAB.SEQNOTA)

    LEFT JOIN CFOP
    ON (CFOP.CFOP = NFITEM.CFOP)

    LEFT JOIN SAFRAS SAFRA_ITEM
    ON (SAFRA_ITEM.SAFRA = NFITEM.SAFRA)

    LEFT JOIN ITEMAGRO
    ON (ITEMAGRO.ITEM = NFITEM.ITEM)

    LEFT JOIN PCLASFIS
    ON (ITEMAGRO.CLASFISCAL = PCLASFIS.CLASFISCAL)

    LEFT JOIN NFCFG
    ON (NFCFG.NOTACONF = NFCAB.NOTACONF)

    LEFT JOIN NFMSGCAD
    ON NFMSGCAD.CODMSG = NFCFG.CODMSG

    LEFT JOIN NFCABTXARM
    ON (NFCABTXARM.ESTAB = NFCAB.ESTAB)
    AND (NFCABTXARM.SEQNOTA = NFCAB.SEQNOTA)

    LEFT JOIN PREPRESE
    ON(NFCAB.REPRESENTESTAB = PREPRESE.EMPRESA)
    AND(NFCAB.REPRESENT = PREPRESE.REPRESENT)

    LEFT JOIN PEMPRESA EMI
    ON (EMI.EMPRESA = NFCAB.ESTAB)

    LEFT JOIN CIDADE CIDEMI
    ON (CIDEMI.CIDADE = EMI.CIDADE)

    LEFT JOIN NFDESC
    ON (NFDESC.ESTAB = NFCAB.ESTAB)
    AND (NFDESC.SEQNOTA = NFCAB.SEQNOTA)

    LEFT JOIN NFMSG
    ON (NFMSG.ESTAB = NFCAB.ESTAB)
    AND (NFMSG.SEQNOTA = NFCAB.SEQNOTA)

    LEFT JOIN CONFAGROE
    ON (CONFAGROE.ESTAB = NFCAB.ESTAB)

    LEFT JOIN CONFDANFE
    ON (CONFDANFE.ESTAB = NFCAB.ESTAB)

    LEFT JOIN NFTRANSP
    ON (NFTRANSP.ESTAB = NFCAB.ESTAB)
    AND (NFTRANSP.SEQNOTA = NFCAB.SEQNOTA)

    LEFT JOIN NFFRETE
    ON (NFCAB.ESTAB = NFFRETE.ESTAB)
    AND (NFCAB.SEQNOTA = NFFRETE.SEQNOTA)

    LEFT JOIN LEPRECOPESSOA
    ON (LEPRECOPESSOA.ESTAB = NFCAB.ESTAB)
    AND (LEPRECOPESSOA.SEQNOTA = NFCAB.SEQNOTA)

    LEFT JOIN CIDADE CIDNFTRANSP
    ON (CIDNFTRANSP.CIDADE = NFTRANSP.CIDADE)

    LEFT JOIN ENDERECO END_ALTERNATIVO
    ON (END_ALTERNATIVO.NUMEROCM = COALESCE(NFCAB.CLIENTEIMP, NFCAB.NUMEROCM))
    AND (END_ALTERNATIVO.SEQENDERECO = NFCAB.SEQENDERECO)

    LEFT JOIN CIDADE CID_END_ALTERNATIVO
    ON (CID_END_ALTERNATIVO.CIDADE = END_ALTERNATIVO.CIDADE)

    LEFT JOIN UF UF_END_ALTERNATIVO
    ON (UF_END_ALTERNATIVO.UF = CID_END_ALTERNATIVO.UF)

    LEFT JOIN CONTAMOV DEST
    ON (DEST.NUMEROCM = COALESCE(NFCAB.CLIENTEIMP, NFCAB.NUMEROCM))

    LEFT JOIN CIDADE CIDDEST
    ON (DEST.CIDADE = CIDDEST.CIDADE)

    LEFT JOIN UF UFDEST
    ON (UFDEST.UF = CIDDEST.UF)

    LEFT JOIN CONTAMOV PRESTADOR
    ON (PRESTADOR.NUMEROCM = NFTRANSP.PRESTADOR)

    LEFT JOIN CIDADE CIDPRE
    ON (CIDPRE.CIDADE = PRESTADOR.CIDADE)

    LEFT JOIN NFCABIMPOSTO ICMS
    ON (ICMS.ESTAB = NFCAB.ESTAB)
    AND (ICMS.SEQNOTA = NFCAB.SEQNOTA)
    AND (ICMS.IMPOSTO = CONFAGROE.IMPOSTOICMS)
    AND ((EMI.MSGSIMPLES IS NULL) OR (EMI.MSGSIMPLES = CHR(32)))

    /LEFT JOIN NFCABIMPOSTO IPI
    ON (IPI.ESTAB = NFCAB.ESTAB)
    AND (IPI.SEQNOTA = NFCAB.SEQNOTA)
    AND (IPI.IMPOSTO = CONFAGROE.IMPOSTOIPI)
    /

    LEFT JOIN NFITEMIMPOSTO NFITEMIMPOSTO_ICMS
    ON (NFITEMIMPOSTO_ICMS.ESTAB = NFITEM.ESTAB)
    AND (NFITEMIMPOSTO_ICMS.SEQNOTA = NFITEM.SEQNOTA)
    AND (NFITEMIMPOSTO_ICMS.SEQNOTAITEM = NFITEM.SEQNOTAITEM)
    AND (NFITEMIMPOSTO_ICMS.IMPOSTO = CONFAGROE.IMPOSTOICMS)
    AND ((EMI.MSGSIMPLES IS NULL) OR (EMI.MSGSIMPLES = CHR(32)))

    LEFT JOIN NFITEMIMPOSTO NFITEMIMPOSTO_IPI
    ON (NFITEMIMPOSTO_IPI.ESTAB = NFITEM.ESTAB)
    AND (NFITEMIMPOSTO_IPI.SEQNOTA = NFITEM.SEQNOTA)
    AND (NFITEMIMPOSTO_IPI.SEQNOTAITEM = NFITEM.SEQNOTAITEM)
    AND (NFITEMIMPOSTO_IPI.IMPOSTO = CONFAGROE.IMPOSTOIPI)

    WHERE (NFCAB.ESTAB = :ESTAB) AND (NFCAB.SEQNOTA)