2016-08-04 17 views
0

Oracle FROM句でOracle Formに使用している約5つのテーブルにリンクするOracle SQLクエリを作成しましたが、レコードは重複しているので、フォームには1行だけを表示し、重複するレコードは表示しません。私はGROUP BYとPARTITION BYステートメントを試しましたが、ステートメントにこれを追加すると、クエリが遅くなります。Oracle SQLはOracleフォーム10gに重複を戻さない

私は今これを手続きとして考えていて、重複があればそれを戻します。データベースからORACLEレコードの表をフォームに戻すのが最善でしょうか?どのようにOracle PL/SQLループで重複を探すのがベストでしょうか?

私は質問を更新し、以下の完全な質問を参考にしてよりよく説明しました。下のSELECT文の最初の列であるsurr_idは一意ですが、Oracle形式で表示したいのは、一意ではない他の列とともに製造番号です。生産数の重複があり、場合によっては3つの製造番号レコードも同じことがあります。お役に立てれば。私はこれをループに入れて最初の生産番号を取得し、生産番号が変わったときに各レコードを取り戻すことを考えていました。

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') 

アドバンス

+0

結果セットの行全体が複製されている場合は、「distinct」を使用できますが、それはクエリまたはデータに問題を示唆するかもしれません...いくつかの列が重複している場合には、維持し、おそらく集約する。あなたはすでにそれを試したようです。現在、最初の行セットを取得していない場合を除き、グループ化はそれほど遅くならないはずです。 –

+0

ユーザーインターフェイスではなくクエリを修正する必要があります。 –

+0

こんにちはGuys、クエリのデータはユニークですが、私はフォームに戻って、私はちょうど生産と駅が表示されますが、フォームのユニークなID、prododuction、駅が重複することがあります。 –

答えて

0

のおかげでみんなが、あなたは完全にあなたのSELECTがSELECT DISTINCTなるようにただ一つだけのレコードが返されることを保証します、DISTINCT句を追加し、その後重複しているレコードを取得している場合。 1つの列でも異なる場合でも、これは機能しません。

+0

Distinctはステートメントのコストを追加します。このDISTINCTは、すべての異なる値を取得するためにテーブルをフルスキャンする必要があるため、クエリの処理速度を低下させます。 –

+0

この場合、完全なステートメントを見る必要があります。これにより、重複がより早い時点で起こらないようにすることができます。 –

+0

@ShaunKinnair - 'distinct'を追加してもフルテーブルスキャンは強制されませんが、ソート/プルーン操作が追加されます。あなたがすでに結果を注文しているのであれば、それははるかに遅いですが、私は驚くでしょう。あなたがそうでなければ、多少遅いかもしれませんが、現在のところ、最初の行のセットしか取得していない可能性が高いようです。 –

関連する問題