2016-06-26 10 views
0

問合せ:ここはどうすれば重複したレコードを削除するには

Select table_c.id_number, table_c.name, table_s.site_name,table_co.Contract_name 
FROM table_c , table_s, table_m, table_o, table_a, table_con 
    WHERE 
    table_s.objid = table_c.sobjid 
    AND table_m.cobjid (+) = table_c.objid 
    AND table_o.objid (+) = table_m.olobjid 
    AND table_a.objid (+) = table_o.aobjid 
    AND table_co.objid (+) = table_a.conobjid; 

私は6つのテーブルを持っています。 table_cとtable_sは1つの2つの1つの関係を持っています。 1つのtable_oレコードに対して、2つのtable_cレコードを持つことができますが、レコードがない可能性もあります.SELECTでtable_cとtable_sテーブルのtable_co値を取る必要があるため、すべてのテーブルに対してleft out joinを使用しました。table_c-> table_m- > table_o-> table_a-> table_co。

このクエリを実行すると、重複したレコードが表示されます。私はtable_cに何百万ものレコードを持っているので、重複したレコードを削除するために別名またはユニオンALLを使用すると、クエリに非常に時間がかかり、これは受け入れられない解決方法です。

このクエリは、パフォーマンスの問題がなく独自のレコードを提供できるようにすることができます。

このクエリは、外部システムによってデータを取得するために使用されるSQLビューの一部です。

ありがとうございます。

+1

明示的な結合構文を使用してクエリを書き換えてください。 –

+0

私はtim join構文に同意すると、あなたの関係がはっきりしないのでトラブルシューティングが簡単になります。 http://www.w3schools.com/sql/sql_join_inner.aspは、新しい概念である場合の内部結合の記事です。私がすぐに見る1つの問題は、他のテーブルとtable_sの関係が定義されていないということです。これは、クロス結合を作成し、おそらくパフォーマンス別のグループまたはグループが貧弱な重複を返す可能性があることを意味します。 – Matt

+0

こんにちは@マット/ @ティム、私はまた、明示的な結合(内部/左外部結合)を使用して、クエリを書き換えるための提案に同意します。もう一つのポイントは、table_sはtable_cとone2oneの関係を持ち、table_cがこのクエリの先頭のテーブルであるため、table_sが重複レコードの理由ではないとは思わない。ありがとう- – HelloFriends

答えて

1

ROW_NUMBER()を使用してみてください:

SELECT * FROM (
    Select table_c.id_number, table_c.name, table_s.site_name,table_co.Contract_name , 
      ROW_NUMBER() OVER(PARTITION BY table_c.id_number,table_c.name ORDER BY 1) as rnk 
    FROM table_c 
    INNER JOIN table_s ON(table_s.objid = table_c.sobjid) 
    LEFT OUTER JOIN table_m ON(table_m.cobjid = table_c.objid) 
    LEFT OUTER JOIN table_o ON(table_o.objid = table_m.olobjid) 
    LEFT OUTER JOIN table_a ON(table_a.objid = table_o.aobjid) 
    LEFT OUTER JOIN table_con ON(table_co.objid = table_a.conobjid)) 
WHERE rnk = 1; 

注:暗黙の結合構文の使用を避ける(カンマ区切り)と参加の適切な構文を使用してください。

私はPARTITION BY table_c.id_number,table_c.nameを使用しました。すべての列を追加すると、「一意の」行が指定されます。

+0

従来の結合構文は間違っていません。混乱するだけです。 – MT0

+0

私は間違った言葉を選んだかもしれませんが、それは私が意味するものではありません。私は適切だと思います@ MT0 – sagi

+0

こんにちは@佐賀、私はあなたのソリューションを試して、結果です:1)私はフィルタ条件を提供する場合、例えば、table_c.id_number = '12345'それは私に重複レコードを与えません。 2)フィルタを適用しない場合、クエリは最初のレコードセットを与えるのに時間がかかりすぎます。だから私はまだパフォーマンスの問題があると信じています。ありがとう – HelloFriends

関連する問題