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
'DISTINCT'에 대한 답변을 얻을 수있을 것입니다. 난 단지 _most_ SQL 쿼리에서 진정으로 복제 된 레코드가 잘못 설계된 데이터 모델 및/또는 잘못 작성된 쿼리의 표시라고 언급하고 싶었습니다. 아마 10 번 중 9 번, 초심자 코드에서 'DISTINCT'키워드를 보았을 때, 실제 문제를 덮는 반창고입니다. 처음에는 중복 기록이 나오는 이유는 무엇입니까? –
예, 잘못 설계되어있어 클라이언트가 소프트웨어를 잘 사용하지 않고 두 가지 모두 데이터에 영향을줍니다. – arnoldssss
@MatthewMcPeak이 끔찍한 점을 감안할 때 쿼리가 잘못 정의되어 "중복"레코드가 나타납니다. 조인 및 필터. 분명히 [이전 복잡성에 대한 질문] (https://stackoverflow.com/q/47984589/146325)에서는이를 알고 있습니다. 그러나이 몬스터를 생성 한 비즈니스 로직을 설명 할 때까지는 다시 작성하는 것을 도와 줄 수 없습니다. – APC