重複削除 - sql 重複条件




特定のフィールドで重複を検索するSELECT文 (4)

SQL Server 2005以降を使用している場合(質問のタグはSQL Server 2008を示しています)、ジョインを使用する場合は、何らかの理由でランク付け関数を使用して重複レコードを返すことはできません。 次の例は、実際の動作を示しています。この例では、検査された列のNULL値も使用できます。

create table Table1 (
 Field1 int,
 Field2 int,
 Field3 int,
 Field4 int 
)

insert  Table1 
values    (1,1,1,1)
        , (1,1,1,2)
        , (1,1,1,3)
        , (2,2,2,1)
        , (3,3,3,1)
        , (3,3,3,2)
        , (null, null, 2, 1)
        , (null, null, 2, 3)

select    *
from     (select      Field1
                    , Field2
                    , Field3
                    , Field4
                    , row_number() over (partition by   Field1
                                                      , Field2
                                                      , Field3
                                         order by       Field4) as occurrence
          from      Table1) x
where     occurrence > 1

すべての "グループ"の最初のレコードが除外され、NULL値を持つレコードが適切に処理されることに注意してください。

グループ内のレコードを並べ替えるための列がない場合は、order-by列としてpartition-by列を使用できます。

複数のフィールドで重複を見つけるためにSQL文を手伝ってもらえますか?

たとえば、擬似コードでは次のようになります。

select count(field1,field2,field3) 
from table 
where the combination of field1, field2, field3 occurs multiple times

上記のステートメントから複数の出現がある場合は 、最初のレコードを除くすべてのレコードを選択したいと思います。


あなたは「最初のもの」に言及しています。だから私はあなたがあなたのデータにある種の注文をしていると仮定します。 あなたのデータがフィールドIDによって順序付けられていると仮定しましょう。

このSQLは、最初のものを除いて重複するエントリを取得する必要があります。 基本的には、(a)同じフィールドと(b)より低いIDが存在する別の行があるすべての行を選択します。 パフォーマンスはあまり良くありませんが、問題が解決する可能性があります。

SELECT A.ID, A.field1, A.field2, A.field3
  FROM myTable A
 WHERE EXISTS (SELECT B.ID
                 FROM myTable B
                WHERE B.field1 = A.field1
                  AND B.field2 = A.field2
                  AND B.field3 = A.field3
                  AND B.ID < A.ID)

複数のレコードがあるフィールドのリストを取得するには、..

select field1,field2,field3, count(*)
  from table_name
  group by field1,field2,field3
  having count(*) > 1

行を削除する方法の詳細については、このリンクをチェックしてください。

http://support.microsoft.com/kb/139444

編集:他のユーザーが述べたように、上記のリンクでアプローチを使用する前に、「最初の行」を定義する方法を決定するための基準が必要です。 それに基づいて、必要に応じてorder by句とサブクエリを使用する必要があります。 サンプルデータを投稿することができれば、本当に役に立ちます。


重複した値を表示するには

with MYCTE  as (
               select row_number() over ( partition by name  order by name) rown,   * from tmptest  

                ) 
              select * from MYCTE where rown <=1




sql-server-2008