2012-01-12 7 views
7

次の表を検討してください。SQL:重複レコードを削除する - 別の種類にもかかわらず

TAB6 
     A   B C 
---------- ---------- - 
     1   2 A 
     2   1 A 
     2   3 C 
     3   4 D 

私が考える、レコード{1,2、A}と{2、1、A}重複します。私は以下のレコードセットを選択して生産する必要があります:

  A   B C      A   B C 
---------- ---------- -    ---------- ---------- - 
     1   2 A   or   2   1 A 
     2   3 C      2   3 C 
     3   4 D      3   4 D 

私は以下の質問を試しました。しかし、役に立たない。

select t1.* 
from t6 t1 
, t6 t2 
where t1.a <> t2.b 
and t1.b <> t2.a 
and t1.rowid <> t2.rowid 
/

     A   B C 
---------- ---------- - 
     1   2 A 
     2   1 A 
     2   1 A 
     2   3 C 
     3   4 D 
     3   4 D 

6 rows selected. 

あるいはこの:

select * 
from t6 t1 
where exists (select * from t6 t2 where t1.a <> t2.b and t1.b <> t2.a) 
/
     A   B C 
---------- ---------- - 
     1   2 A 
     2   1 A 
     2   3 C 
     3   4 D 

の両方が動作しませんでした。

データベースはOracle 10gです。純粋なSQLソリューションを探しています。すべての助けに感謝します。

+0

あなたが達成するために、正確に何をしようとしていますか?これを拡大してください。 – simchona

+0

レコードセット{1,2、A}、{2,3、C}と{3,4、D}を生成するにはSQLが必要です。私の場合、{1,2、A}と{2、1、A}は重複したレコードであり、結果セットはタプル({1,2、A}または{2、1、A} ) –

+0

「削除する」とは、*削除するのではなく、結果セットからフィルタを削除することだけです。 – APC

答えて

6

複数の列にわたって共通の値を識別するには、GREATEST()およびLEAST()関数を使用します。次に、DISTINCTを使用して重複を取り除きます。

select distinct least(a, b) as a 
     , greatest(a, b) as b 
     , c 
from t6 

これは、あなたが求めた正確なレコードセットを提供します。しかし、T6の他の列を含める必要がある場合は、より複雑になります。


「しかし、これはまた、VARCHAR2のフィールドのために働くだろうかと思いまして?」

はいですが、ASCII値を使用して順序を決定しますが、これは必ずしもユーザーが期待しているとは限りません。

「私のテーブルT6には、何万ものレコードが含まれている可能性があります。」

これは、今日の用語では実際には大量のデータではありません。 DISTINCTはソートを発生させます。これは、ABが本当に長いVARCHAR2列でない限りメモリに収めることができます。

これはあなたが多くのことを実行したいとしているクエリであるなら、あなたはそれを満たすためにファンクション索引構築することができます:

create index t6_fbi on t6(least(a, b) 
          , greatest(a, b) 
          , c) 
/

をしかし、あなたは本物を持っている場合、私は本当にだけわざわざパフォーマンスに関する問題が発生します。

+0

ありがとう@APC、私は今これを確認することができませんでした。しかし、これがVARCHAR2フィールドでも機能するのではないかと思っていましたか?また、私のテーブルT6は数万のレコードを持つ可能性があります..私はあなたの応答をありがとうが、まだStackoverflowは私があなたの投票をまだ許可していません。 :( –

0

列AとBの順番は約どのように、問題では、常に整数が含まれていない場合は、次の

select distinct 
    least(a, b) as a, 
    greatest(a, b) as b, 
    c 
from 
    t6 
関連する問題