Optimierung der Abfrageausführung für den Umgang mit doppelten Kunden-IDsJava

Java-Forum
Guest
 Optimierung der Abfrageausführung für den Umgang mit doppelten Kunden-IDs

Post by Guest »

Ich habe ein Schema ähnlich dem gezeigten und muss Transaktionsinformationen abrufen.
[img]https://i .sstatic.net/xVhLpCri.jpg[/img]

Ich möchte Datensätze aus der CUSTOMER-Tabelle mit denen in der TRANSACTION-Tabelle abgleichen.
Zuvor , wir haben uns ausschließlich auf die verlassen CUSTOMER_ID-Feld für den Abgleich.
Wir haben jedoch beobachtet, dass die TRANSACTION-Tabelle mehrere Datensätze mit derselben CUSTOMER_ID enthält.
Um dies zu beheben, müssen wir einen Algorithmus definieren, der Fälle verarbeiten kann, in denen es mehrere Übereinstimmungen gibt Datensätze für dieselbe CUSTOMER_ID.
Die Lösung sollte basierend auf den folgenden Kriterien übereinstimmen:
  • TRANSACTION.CUSTOMER_ID = CUSTOMER.CUSTOMER_ID.
  • SUBSTR(TRANSACTION.ACCOUNT_NUMBER, INSTR(TRANSACTION.ACCOUNT_NUMBER, '.') + 1) = CUSTOMER.ACCOUNT_NUMBER.
  • TRANSACTION.ADDRESS = CUSTOMER.ADDRESS (diese Bedingung sollte optional sein, wenn das Feld ADDRESS vorhanden ist).
  • In Fällen, in denen mehrere Zeilen übereinstimmen, wählen Sie die Transaktion mit dem frühesten ISSUE_DATE aus, vorausgesetzt, dass CUSTOMER.CREATED_AT {
    StringBuffer qryStr = new StringBuffer() //
    .append(
    "SELECT "
    + " er.CUSTOMER_ID, "
    + " er1.ID, "
    + " er1.DESCRIPTION, "
    + " er1.REFERENCE_NUMBER, "
    + " er1.CATEGORY "
    + " FROM TRANSACTION er "
    + " INNER JOIN DETAILS er1 "
    + " ON (er.ID = er1.EM_ID) "
    + " WHERE "
    );

    String inCustomerIdList = NativeQuerySupport.inClause(batch);
    qryStr.append(" er.CUSTOMER_ID IN ").append(inCustomerIdList);
    Query query = em.createNativeQuery(qryStr.toString());

    results.addAll(query.getResultList());
    });

    ret = results.stream()
    .map(erm -> Details.toModel(erm))
    .collect(Collectors.toList());

    return ret;
    }
    [/code]
    Ich denke also, dass der Parameter der Methode eine Liste aller Felder von CUSTOMER sein sollte.

    Code: Select all

    public List searchTransactions(List criteria)
    
    and the query to be as below
    StringBuffer qryStr = new StringBuffer() //
    .append(
    "SELECT "
    + " er.CUSTOMER_ID, "
    + " er1.ID, "
    + " er1.DESCRIPTION, "
    + " er1.REFERENCE_NUMBER, "
    + " er1.CATEGORY "
    + " FROM TRANSACTION er "
    + " INNER JOIN DETAILS er1 "
    + " ON (er.ID = er1.EM_ID) "
    + " WHERE er.CUSTOMER_ID = ?customerId "
    + " AND SUBSTR(er.ACCOUNT_NUMBER, INSTR(er.ACCOUNT_NUMBER, '.') + 1) = ?accountNumber "
    + " AND (er.ADDRESS = ?address OR ?address IS NULL ) "
    + " AND er.ISSUE_DATE = ( "
    + "  SELECT MIN(em2.ISSUE_DATE) "
    + "    FROM TRANSACTION em2 "
    + "   WHERE er.CUSTOMER_ID = em2.CUSTOMER_ID "
    + "     AND er.ACCOUNT_NUMBER = em2.ACCOUNT_NUMBER "
    + "     AND (er.ADDRESS = em2.ADDRESS OR ?address IS NULL )"
    + "     AND em2.ISSUE_DATE >= ?createdAt)");
    
    Query query = em.createNativeQuery(qryStr.toString());
    query.setParameter("customerId", criteria.getCustomerId());
    query.setParameter("accountNumber", criteria.getAccountNumber());
    query.setParameter("address", criteria.getAddress());
    query.setParameter("createdAt", criteria.getCreatedAt());
    
    Mit dem oben genannten Ansatz muss ich so viele Abfragen ausführen, wie es Kriterien gibt, was die Leistungsvorteile, die durch die Stapelverarbeitung in der vorherigen Implementierung erzielt wurden, zunichte macht.
    Gibt es eine bessere Möglichkeit, damit umzugehen?
    Könnten wir beispielsweise die vorherige Abfrage verwenden, um alle erforderlichen Daten abzurufen, und dann im Falle doppelter CUSTOMER_IDs eine zweite Abfrage durchführen, um Konflikte zu lösen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post