重複

2011-09-16 7 views
3

可能性の重複:
Delete duplicate records from a SQL table without a primary key重複

私が持っているデータ:私は)dublicateレコードによって出力(次の(順序を取得する必要があります

SELECT 
      a 
     , b 
    FROM 
    (
     select a = 1, b = 30 
     union all 
     select a = 2, b = 50 
     union all 
     select a = 3, b = 50 
     union all 
     select a = 4, b = 50 
     union all 
     select a = 5, b = 60 
    ) t 

結果セットから除外する必要があります):

Oracleで
a   b 
----------- ----------- 
1   30 
2   50 
3   50 -- should be excluded 
4   50 -- should be excluded 
5   60 
+1

そこで質問がB'によって B グループ...から、(a)の分を選択し、 'よりも複雑ですか? - それはあなたのサンプルデータ – antlersoft

+0

@antlersoftと一緒に使えるので十分です。私は持っています:aはintであり、bはuniqueidentifierですので、それも動作します。ありがとうございました。 – garik

答えて

4
SELECT 
      min(a) as a 
     , b 
    FROM 
    (
     select a = 1, b = 30 
     union all 
     select a = 2, b = 50 
     union all 
     select a = 3, b = 50 
     union all 
     select a = 4, b = 50 
     union all 
     select a = 5, b = 60 
    ) t 
GROUP BY b  
ORDER BY a 
+1

aに数字以外のエントリがある場合はどうなりますか? – Pepe

+0

@ P.R - あなたは 'min()'を使えるはずです。 –

+0

それはクラッシュし、数値に変換できなかったと言います(私はMSで試しました) – Pepe

1

私はあなたが同様の操作を行うことができるはず、group by句を使用して、これを行うことができました。

select min(a), b 
from (select 1 a, 30 b 
     from dual 
     union all 
     select 2 a, 50 b 
     from dual 
     union all 
     select 3 a, 50 b 
     from dual 
     union all 
     select 4 a, 50 b 
     from dual 
     union all 
     select 5 a, 60 b from dual) 
group by b; 

編集:他の誰かがMSのSQLソリューションを思い付いたように、私も後世のためにここにこれを残しておきます見えます。

1

これを行う最も簡単な方法は、簡単なGROUP BYである:

SELECT 
     a 
    , b 
INTO #tmp 
FROM 

(
    select a = 1, b = 30 
    union all 
    select a = 2, b = 50 
    union all 
    select a = 3, b = 50 
    union all 
    select a = 4, b = 50 
    union all 
    select a = 5, b = 60 
) t 


SELECT DISTINCT MIN(a) AS a,b 
FROM #tmp 
GROUP BY b 
ORDER BY a 
+1

あなたがbでグループ化しているときに別名は何もしません。そして、あなたがaの集約であれば、各行は既に別名になっています。 – TimothyAWiseman