2016-05-12 22 views
0

私は必要な正確なデータを返す長い複合(少なくとも私にとっては)のクエリを持っています。多対1の関係を持つ問合せで1つの結合が原因で一部のIDが重複しているという問題のみです。私がしたいのは、クエリから出力を取り出し、一意のIDごとに1つの行を選択することだけです。この行が重複IDからどのように選択されているかは関係ありません。できるだけ単純な方法でIDごとに1行に減らす必要があります。言い換えればOracle SQL - 面倒なクエリから重複を取り除く

は私がきちんとという名前の列を持つ私が必要とするデータを提供し、長い厄介なクエリなどを持っていますが、はIDが重複:

ID column1 column2 column2... column50 
111 data data data ... data 
111 data data data ... data 
112 data data data ... data 
113 data data data ... data 
113 data data data ... data 
113 data data data ... data 

をそして私は、クエリからこの出力を取得し、それを減らしたいです

ID column1 column2 column2... column50 
111 data data data ... data 
112 data data data ... data 
113 data data data ... data 

私がいる課題は、私は、クエリからの出力全体を取り、最初のテーブルにそれを記述することなく(のような重複を削除)ことでものを行う方法がわからないということである、と私は」テーブルに書き込めません。

+0

各IDの行の選択方法を指定する必要があります。 (rownoおそらく?) – jarlh

+2

また、あなたの質問を編集して、あなたのサンプルデータと一緒に行くためのあなたの質問の(短い!)例を提供するのが助けになります。また、問題を小規模に正確に複製したサンプルデータを提供することができれば役立ちます。たとえば、「重複した」行や列ごとに同じデータがあるなどです。または、データが異なる可能性があります。 (id = 111、col1 = 'a'、col2 = 10)id = 111、col1 = 'a'、col2 = 20)?後者の場合は、どの行を選んでいいですか? – Boneist

答えて

2

データが同じ場合は、もっとも単純な方法は、SELECT DISTINCTだけを使用する別のクエリであなたの乱雑なクエリをラップすることです。

SELECT DISTINCT * 
FROM (
    your_messy_query 
) 

それが同一でない場合は、あなたが使用することができます:このよう

SELECT * 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY something) AS rn 
    FROM (
    your_messy_query 
) t 
) 
WHERE rn = 1; 

ORDER BY somethingは次のようになります。

  • 列の特定のセットあなたが最もを取得する方法ならば適切なデータ。
  • 、または各グループの最初の行を取りたい場合はORDER BY ROWNUMを使用できます。
  • またはORDER BY NULLとなりますが、通常これはORDER BY ROWNUMと同じ効果で実装されているようです。
+0

ありがとうございます、私は2番目のケース(それは同一ではありません)を見ていますが、 "ORA-00923:FROMキーワードが期待どおりに見つかりません" SELECT * は( SELECT Tから ...ここに完全なクエリ がある* ROW_NUMBER - 私はちょうどそれをシンプルに保つために、「顧客からのSELECT *」と私は同じエラーを取得しておくことを私の厄介なクエリを変更しました。 ()RN = 1 )T (CUSTOMER FROM SELECT *)FROM AS RN(CUSTOMER_ID ORDER BY ROWNUM BY PARTITION)OVER。 –

+0

決して気にしないで、「SELECT t。*」の後ろにカンマが見つからなかった –

+0

NPはあなたの助けにとても感謝しています。 –

関連する問題