2016-08-04 50 views
0

Ich habe eine Oracle SQL-Abfrage erstellt, die zu etwa fünf Tabellen, die ich in einer Oracle FROM-Klausel verwende, zu einem Oracle-Formular verknüpft, aber das Problem mit der Abfrage ist, dass einige Datensätze werden dupliziert, daher möchte ich nur eine Zeile im Formular und keine doppelten Datensätze anzeigen. Ich habe versucht, GROUP BY und PARTITION BY-Anweisungen, aber die Abfrage wird langsam mit dem Hinzufügen dieser in der Anweisung.Oracle SQL bringt keine Duplikate zu einem Oracle Formular zurück 10g

Ich denke jetzt darüber nach, dies als eine Prozedur zu tun und nur eines der Duplikate zurückzuholen, wenn irgendwelche auftreten. Wäre es das Beste, eine ORACLE-Tabelle von Datensätzen aus der Datenbank in das Formular zurückzuholen? Wie wäre es am besten, in einer Oracle PL/SQL-Schleife nach einem Duplikat zu suchen?

Ich habe die Frage aktualisiert und die vollständige Abfrage unten hinzugefügt, um es besser zu erklären. Die surr_id die erste Spalte in Select-Anweisung unten ist einzigartig, aber was ich im Oracle-Formular anzeigen möchte, ist die Produktionsnummer zusammen mit den anderen Spalten, die nicht eindeutig sind. Es kann doppelte Produktionsnummern geben und manchmal sogar drei Produktionsnummern. Hoffe das hilft. Ich dachte darüber nach, dies in eine Schleife zu stellen und einfach die erste Produktionsnummer zu nehmen und dann nur jeden Datensatz zurück zu bringen, wenn sich die Produktionsnummer ändert.

select x.surr_id , 
    x.supplier_name as supplier , 
    x.broadcaster_name as broadcaster , 
    ptle.title as production_title , 
    x.production_number as production_number , 
    stle.title as series_title , 
    x.production_source as supplied_source_ind , 
    x.third_party_group_id , 
    x.bro_broadcast_by_tp_surr_id , 
    x.station_id from (select usage_headers.surr_id as surr_id , 
          broad_supp.supplier_name as supplier_name , 
          broad_supp.broadcaster_name as broadcaster_name , 
          usage_headers.production_number as production_number , 
          productions.production_source as production_source , 
          broad_supp.station_id as station_id , 
          usage_headers.prod_exploitation_cre_surr_id as prod_exploitation_cre_surr_id , 
          usage_headers.bro_broadcast_by_tp_surr_id as bro_broadcast_by_tp_surr_id , 
          productions.cre_surr_id as cre_surr_id , 
          productions.prod_series_cre_surr_id as prod_series_cre_surr_id , 
          broad_supp.third_party_group_id as third_party_group_id 
         from usage_headers, productions, (SELECT /*+ index (bro bro_pk) */ 
                   third_party.surr_id AS THIRD_PARTY_SURR_ID, 
                   third_party.supplier_group_id AS THIRD_PARTY_GROUP_ID, 
                   third_party.dn_root_tp_surr_id AS THIRD_PARTY_ROOT_ID, 
                   third_party.supplier_name, bro.station_id AS STATION_ID, 
                   bro.dn_tp_name AS BROADCASTER_NAME FROM (SELECT tp.surr_id, 
                               tp.name AS supplier_name, 
                               tp.tp_surr_id AS supplier_group_id, 
                               tp.dn_root_tp_surr_id FROM third_parties tp 
                               CONNECT BY PRIOR tp.surr_id = tp.tp_surr_id 
                               START WITH tp.surr_id IN (4251, 4247, 4237, 4034, 10157, 14362, 9834)) third_party 
         JOIN broadcasters bro ON (third_party.surr_id = bro.tp_surr_id)) broad_supp 
        where broad_supp.THIRD_PARTY_SURR_ID = usage_headers.bro_broadcast_by_tp_surr_id 
        AND usage_headers.prod_exploitation_cre_surr_id = productions.cre_surr_id 
        and usage_headers.prod_exploitation_cre_surr_id IS NOT NULL 
        and usage_headers.right_type in ('M','B') 
        AND usage_headers.udg_surr_id IS NOT NULL 
        AND NVL(usage_headers.dn_uls_usage_status,'3') NOT IN ('9', '11') 
        AND productions.production_source <> 'AP') x 
    LEFT OUTER JOIN titles ptle ON (ptle.cre_surr_id = x.cre_surr_id AND ptle.tt_code = 'R') 
    LEFT OUTER JOIN titles stle ON (stle.cre_surr_id = x.prod_series_cre_surr_id AND stle.tt_code = 'R') 

Danke Jungs im Voraus

+0

Wenn die gesamte Zeile der Ergebnismenge doppelt vorhanden ist, können Sie 'distinct' verwenden. Dies könnte jedoch auf ein Problem mit Ihrer Abfrage oder Ihren Daten hinweisen ... Wenn einige Spalten doppelt vorhanden sind, aber andere eindeutig sind, müssen Sie entscheiden behalten und dann möglicherweise aggregieren; aber du scheinst das schon versucht zu haben. Die Gruppierung sollte nicht viel verlangsamen, es sei denn, Sie holen derzeit nur die erste Gruppe von Zeilen. –

+0

Sie müssen die Abfrage reparieren, nicht die Benutzeroberfläche. –

+0

Hallo Leute, die Daten in der Query sind eindeutig, aber was ich zurück in das Formular bringen will ist nicht, also die select unique_id, prododuction, station in der Query aber in form möchte ich nur die Produktion und Station aber die Produktion zeigen und Station manchmal duplizieren. –

Antwort

0

Wenn Sie immer Datensätze, die dann vollständig dupliziert werden nur das Hinzufügen einer DISTINCT Klausel, so dass Ihr SELECT SELECT DISTINCT wird sichergestellt wird, dass nur einer der Datensätze zurückgegeben. Wenn auch nur eine Spalte anders ist, funktioniert das nicht.

+0

Distinct addiert sich zu den Kosten der Anweisung und diese DISTINCT verlangsamt die Abfrage, da sie einen vollständigen Scan der Tabelle durchführen muss, um alle eindeutigen Werte zu erhalten. –

+0

In diesem Fall müssten wir die vollständige Anweisung sehen, damit wir die Duplikate zu einem früheren Zeitpunkt verhindern können. –

+0

@ShaunKinnair - das Hinzufügen von 'distinct' erzwingt keinen vollständigen Tabellenscan, aber es fügt eine Operation zum Sortieren/Bereinigen hinzu; Ich würde mich wundern, wenn es merklich langsamer ist, wenn Sie bereits die Ergebnisse bestellen. Wenn Sie das nicht tun, wäre es vielleicht etwas langsamer, aber es scheint noch wahrscheinlicher, dass Sie derzeit nur die ersten Reihen abrufen. –