Consulta SQL com existe e conta para muitos campos na subconsulta

Oct 09 2020

Eu tenho esta dúvida:

SELECT *
FROM j_1gvl_ml AS jml
WHERE sptag IN @s_sptag AND
      bukrs = @p_bukrs AND
      werks IN @s_werks AND
      matnr IN @s_matnr AND
      tract IN @s_tract AND
      erdat IN @s_erdat AND
      repid = @p_repid AND
      EXISTS ( SELECT vrsio,whbcode,bukrs,belnr,buzei,
                      werks,locat,matnr,bwtar,orgn, COUNT( * )
                FROM j_1gvl_ml
                WHERE vrsio = jml~vrsio AND
                      sptag = jml~sptag AND
                      whbcode = jml~whbcode AND
                      bukrs = jml~bukrs AND
                      belnr = jml~belnr AND
                      buzei = jml~buzei AND
                      werks = jml~werks AND
                      locat = jml~locat AND
                      matnr = jml~matnr AND
                      bwtar = jml~bwtar AND
                      orgn = jml~orgn
                GROUP BY vrsio,whbcode,bukrs,belnr,buzei,
                      werks,locat,matnr,bwtar,orgn
                HAVING COUNT( * ) > 1  )
  INTO TABLE @itj_1gvl_ml.

Ocorreu um erro que não posso ter mais de 1 campo na subconsulta.

Eu sei que posso ter 2 consultas para todas as entradas. Mas estou procurando se tem possivel, ter em 1 query ter apenas os registros duplos, triplos etc.

Isso é possível?

Respostas

3 Florian Oct 11 2020 at 03:10

Uma EXISTSsubconsulta existe para qualificar quais linhas você deseja selecionar. Ele não adiciona linhas ou colunas ao conjunto de resultados.

Reduza a lista de colunas na SELECTcláusula de sua subconsulta a qualquer uma das colunas, ou mesmo a um literal - como SELECT 1- e você obterá suas duplicatas:

SELECT *
  FROM j_1gvl_ml AS jml
  WHERE sptag IN @s_sptag AND
        bukrs = @p_bukrs AND
        werks IN @s_werks AND
        matnr IN @s_matnr AND
        tract IN @s_tract AND
        erdat IN @s_erdat AND
        repid = @p_repid AND
        EXISTS ( SELECT belnr
                  FROM j_1gvl_ml
                  WHERE vrsio = jml~vrsio AND
                        sptag = jml~sptag AND
                        whbcode = jml~whbcode AND
                        bukrs = jml~bukrs AND
                        belnr = jml~belnr AND
                        buzei = jml~buzei AND
                        werks = jml~werks AND
                        locat = jml~locat AND
                        matnr = jml~matnr AND
                        bwtar = jml~bwtar AND
                        orgn = jml~orgn
                  GROUP BY vrsio,whbcode,bukrs,belnr,buzei,
                        werks,locat,matnr,bwtar,orgn
                  HAVING COUNT( * ) > 1  )
    INTO TABLE @itj_1gvl_ml.