2017-12-27 15 views
0

Oracle 데이터베이스의 일부 테이블에 대한 데이터를 검색하는 쿼리가 있습니다.쿼리에서 구별하거나 그룹화하십시오.

결국 내가 필요로하는 것은 중복되지 않는 모든 데이터를 얻는 것입니다.이를 달성하기 위해 나는 같은 FOLIO, TARJETA, CUENTA 및 IMPORTE가없는 모든 레코드가 필요합니다. 이렇게하려면 Distinct와 Group을 사용하려고 시도했지만 스크립트에서 어디서/어떻게 사용해야하며 가능한 경우 더 효율적으로 사용할 수 있는지 알고 싶습니다.

ORDER BY 이전의 값으로 GROUP BY를 배치하려고했지만 "GROUP BY 표현이 아닙니다"라고 말합니다. 중복 된 인수 (FOLIO, TARJETA, CUENTA 및 IMPORTE)를 사용하여 중복을 제거하는 쿼리를 수정하고 싶지 않습니다.

SELECT FOLIO_EXP, 
     FOLIO, 
     DOC, 
     REFERENCIA, 
     TARJETA, 
     CUENTA, 
     NOMBRE, 
     IMPORTE, 
     IMP_REC, 
     IMP_REPRE, 
     IMP_QUEB, 
     FECHA_PAGO, 
     MCC, 
     COMERCIO, 
     PCC, 
     FECHA_COM, 
     ADQUIRENTE, 
     ESTADO, 
     "TIPO DE FRAUDE", 
     F_FRAUDE, 
     F_RECLAMO, 
     F_REEMBOLSO, 
     DICAMINO 
FROM 
    (SELECT E.FOLIO_EXP, 
      A.FOLIO, 
      'D' AS DOC, 
      A.REFERENCIA, 
      A.TARJETA, 
      A.ACCT_NUM AS CUENTA, 
      B.NOMBRE_TH AS NOMBRE, 
      TO_CHAR(A.MONTO,'999,999.99') IMPORTE, 
      D.IMP_REC, 
      F.IMP_REPRE, 
      DECODE((A.MONTO -D.IMP_REC),NULL,A.MONTO,(A.MONTO -D.IMP_REC)) AS IMP_QUEB, 
      D.FECHA_PAGO, 
      A.SIC_CDE AS MCC, 
      A.COMERCIO, 
      C.PCC, 
      C.FECHA_COM, 
      C.ADQUIRENTE, 
      C.ESTADO, 
      'INTERNET' AS "TIPO DE FRAUDE", 
      A.FECHA_TRANS AS F_FRAUDE, 
      A.FECHA_RECLAMO AS F_RECLAMO, 
      A.FECHA_BONIFICACION AS F_REEMBOLSO, 
      A.USUARIO AS DICAMINO 
    FROM OPPF.T00EMISOR A 

    LEFT JOIN 
    (SELECT A.FECHA, 
      A.TARJETA, 
      C.PCC, 
      C.FECHA_COM, 
      C.ADQUIRENTE, 
      C.ESTADO 
     FROM 
     (SELECT TARJETA, 
       MAX(FECHA_INFO) FECHA 
     FROM OPPF.T00_PCC 
     GROUP BY TARJETA) A 
     LEFT JOIN 
     (SELECT FECHA_INFO, 
       TARJETA, 
       PCC, 
       FECHA_COM, 
       ADQUIRENTE, 
       ESTADO 
     FROM OPPF.T00_PCC)C ON(A.TARJETA = C.TARJETA 
           AND A.FECHA = C.FECHA_INFO)) C ON(TO_CHAR(C.TARJETA) = TO_CHAR(A.TARJETA)) 

    LEFT JOIN 
    (SELECT MAX(SE_REVISO) SE_REVISO, 
      NOMBRE_TH, 
      TARJETA 
     FROM OPPF.T00CASOSRESUELTOS 
     GROUP BY TARJETA, 
       NOMBRE_TH) B ON(SUBSTR(A.TARJETA,1,16) = SUBSTR(B.TARJETA,1,16) 
           AND A.FECHA_BONIFICACION = B.SE_REVISO) 
    LEFT JOIN 
    (SELECT MAX(FECHA_PAGO) FECHA_PAGO, 
      TARJETA, 
      REFERENCIA, 
      COUNT(REFERENCIA) N, 
      SUM(MONTO_LIQ) AS IMP_REC--, FECHA_TRXS 

     FROM OPPF.T00_CC_RECUP 
     GROUP BY TARJETA, 
       REFERENCIA, 
       FECHA_TRXS) D ON(TO_CHAR(D.TARJETA) = TO_CHAR(A.TARJETA) 
           AND D.REFERENCIA = A.REFERENCIA) 
    LEFT JOIN 
    (SELECT TARJETA, 
      COUNT(TARJETA) TRANS, 
      COUNT(REFERENCIA) NR, 
      REFERENCIA, 
      SUM(IMPORTE) IMP_REPRE 
     FROM OPPF.T00_REPRESENTACIONES 
     GROUP BY TARJETA, 
       REFERENCIA) F ON(A.TARJETA = F.TARJETA 
           AND LPAD(TO_CHAR(A.REFERENCIA),23,'0') = LPAD(TO_CHAR(F.REFERENCIA),23,'0')) 
    LEFT JOIN 
    (SELECT MIN(FOLIO) FOLIO_EXP, 
      TARJETA, 
      FECHA_BONIFICACION 
     FROM OPPF.T00EMISOR --WHERE FECHA_BONIFICACION BETWEEN '02/09/2015' AND '31/12/2015' 

     GROUP BY FECHA_BONIFICACION, 
       TARJETA 
     ORDER BY FECHA_BONIFICACION, 
       TARJETA, 
       FOLIO_EXP) E ON(E.TARJETA = A.TARJETA 
           AND E.FECHA_BONIFICACION = A.FECHA_BONIFICACION) 
    WHERE A.ENTRY_MODE IN (' ', 
          '1', 
          '01', 
          '001', 
          '0', 
          '00', 
          '012', 
          '010', 
          '12', 
          '10', 
          '11', 
          '011')) 
WHERE F_REEMBOLSO = '04/07/2017' 

ORDER BY FOLIO, 
     REFERENCIA 
+2

'DISTINCT'에 대한 답변을 얻을 수있을 것입니다. 난 단지 _most_ SQL 쿼리에서 진정으로 복제 된 레코드가 잘못 설계된 데이터 모델 및/또는 잘못 작성된 쿼리의 표시라고 언급하고 싶었습니다. 아마 10 번 중 9 번, 초심자 코드에서 'DISTINCT'키워드를 보았을 때, 실제 문제를 덮는 반창고입니다. 처음에는 중복 기록이 나오는 이유는 무엇입니까? –

+0

예, 잘못 설계되어있어 클라이언트가 소프트웨어를 잘 사용하지 않고 두 가지 모두 데이터에 영향을줍니다. – arnoldssss

+1

@MatthewMcPeak이 끔찍한 점을 감안할 때 쿼리가 잘못 정의되어 "중복"레코드가 나타납니다. 조인 및 필터. 분명히 [이전 복잡성에 대한 질문] (https://stackoverflow.com/q/47984589/146325)에서는이를 알고 있습니다. 그러나이 몬스터를 생성 한 비즈니스 로직을 설명 할 때까지는 다시 작성하는 것을 도와 줄 수 없습니다. – APC

답변

1

최상의 결과를 얻으려면 중복되는 결과를 얻지 않으려면 DISTINCT를 선택하십시오.

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212

Normaly GROUP BY가 MAX, MIN 등 같은 집계 함수에 사용됩니다 :

DISTINCT와 GROUP BY 적어도 (오라클 스타일)에 의한 차이가 없다. 고유 한 것은 중복을 제거하는 것입니다.

SQL 서버는 집계 함수가 없는지 감지하고 "Distinct"를 사용하는 것처럼 실행 계획을 생성합니다. 그래서 큰 차이는 없습니다.

그래서 DISTINCT를 사용하면 올바른 개념을 사용할 수 있습니다. 희망이 도움이됩니다.

+0

오케이, 어디에서 뚜렷하게 구분할 수 있는지 알고 있습니까? – arnoldssss

관련 문제