1

重複の処理に関する多くの質問を読み、それらは私が持っている SQL を書くのに役立ちましたが、私の探求は、重複フィールドではなく別のフィールドに基づいて重複を削除することです。

私のプロジェクトでは、3 つの列が等しいことに基づいて重複を定義していますが、重複することのない 4 番目の列トランザクションの日付/時刻があります。最新のトランザクションを保持し、古いトランザクションを破棄したい。

ここに私がすでに持っているものがあります
SELECT Table_A.Fld1, Table_A.Fld2, Table_A.Fld3, Table_A.Fld4, Table_A.Date_Updated FROM Table_A INNER JOIN (SELECT Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 FROM Table_A GROUP BY Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 HAVING count(*)>1) AS Temp ON (Table_A.Fld4 = Temp.Fld4) AND (Table_A.Fld3 = Temp.Fld3) AND (Table_A.Fld2 = Temp.Fld2);

これにより、重複リストが生成されます

FLD_reUpdates_qry
Fld2 Fld3 Fld4 Date_Updated
6 ユーザー ID_lst 1394522856 2012 年 6 月 21 日 15:21:59
6 ユーザー ID_lst 1394522856 2012 年 6 月 21 日 15:22:21
67 [活動中?] 1099608160 2012/06/19 19:09:16
67 [活動中?] 1099608160 2012/06/19 19:09:17
68 Url_lst 1107138998 2012/6/21 15:21:16
68 Url_lst 1107138998 2012/6/21 15:21:42
74 User_ID_lst 1044317178 2012/6/21 15:26:24
74 User_ID_lst 1044317178 2012/06/21 15:27:15
74 User_ID_lst 1044317178 2012/6/21 15:28:50

これは問題ありません。重複のリストがあります。ご覧のとおり、レコード 74 には 3 つの重複があります。しかし、私が欲しいのは、最新の時間の重複です。だから私はこのクエリを持っています..
SELECT max(date_updated) AS LatestUpdate, Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 FROM Table_A GROUP BY Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 HAVING count(1)> 1;
次のリストを生成します...

FLD_LatestReupdates_Qry
最新の更新 Fld2 Fld3 Fld4
2012 年 6 月 21 日 15:22:21 6 User_ID_lst 1394522856
6/19/2012 19:09:17 67 [アクティブ?] 1099608160
2012 年 6 月 21 日 15:21:42 68 Url_lst 1107138998
2012 年 6 月 21 日 15:28:50 74 User_ID_lst 1044317178


ああ!これで、保持したいもののリストができました。レコード 74 を使用しても、最新のエントリしかありません。しかし、私が本当に欲しいのは、他の重複を削除することです。そして、それは私が精神的なブロックに遭遇したように見えるところです. 古い重複レコードのみを削除し (最後のレコードを保持)、他の重複していないレコードは削除しないクエリを作成するにはどうすればよいですか?

4

3 に答える 3

1

このコードで、クエリFLD_LatestReupdates_Qryをサブクエリとして使用して、重複した行を削除し、最新の date_updated を持つレコードのみを残します。DELETE のこの systax は Sql Server に対応します。別のバックエンドで使用する場合は、少し変更が必要になる場合があります。

DELETE A 
FROM Table_A A
INNER JOIN 
( SELECT max(date_updated) AS LatestUpdate, Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 
    FROM Table_A 
GROUP BY Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 HAVING count(1)> 1 
) B
ON A.Fld2 = B.Fld2 AND A.Fld3 = B.Fld3 AND A.Fld4 = B.Fld4
WHERE A.date_updated < B.LatestUpdate
于 2012-06-23T04:36:58.587 に答える
0

保持するものを選択するクエリが作成されたので、そのクエリによって返されないものをすべて削除する削除クエリを作成できます。したがって、次のようにクエリをラップできます。

DELETE FROM Table_A
WHERE date_updated NOT IN (
  SELECT max(date_updated) 
  FROM Table_A GROUP BY Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 
  HAVING count(1)> 1    
)
于 2012-06-23T03:23:44.270 に答える
0

ここで、最初のレコードだけを残して重複を削除するように SQL コードを更新します。Access 2007 でもこのコードを使用できます。

DELETE *
    FROM Test
    WHERE ID NOT IN (SELECT * 
                        FROM (SELECT MIN(n.ID)
                                FROM Test n
                            GROUP BY n.Projects));

テストはテーブル名です..

Projectsは重複を排除するためのフィールド名です

nは、同じオブジェクトを使用したり、必要に応じて変更したりできるオブジェクトです

于 2013-01-04T17:31:38.920 に答える