2017-12-27 13 views
0

oracleデータベースの一部の表のデータを取得するための問合せがあります。問合せで別名またはグループ化する

私が最後に必要とするのは、重複していないすべてのデータを取得することです。これを達成するために、同じFOLIO、TARJETA、CUENTA、およびIMPORTEを持たないすべてのレコードが必要です。 このため、私はDistinctとGroup byを使用しようとしましたが、どこで/どのようにスクリプトで使用すべきかわかりません。

私は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なので、結果が重複しないようにする必要はありません。

少なくとも(Oracleスタイル)によって差がないDISTINCTとGROUP BY:

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

Normaly GROUP BYは、MAX、MINなどのような集約関数のために使用されます。明らかに重複を削除するだけです。

SQLサーバーは、集計関数がないかどうかを検出し、単に「Distinct」を使用したかのように実行計画を生成します。だから本当に大きな違いはありません。

したがって、DISTINCTを使用すると正しいコンセプトが得られます。 これが役立つことを願っています。

+0

ok、どこに別の場所を置くことができるのか分かりますか? – arnoldssss

関連する問題