3

テーブルから重複レコードを削除する必要があります。構文: T-SQL (MS SQL Server)

それには2つの困難があります:

  1. 行比較に影響を与えてはならないデータを含むフィールドがあります
  2. 「1対多」の関係を持つ最初のテーブルにリンクされた追加のテーブルがあります

例:

Table A                 Table B
--------------          --------------
AId - int       <-\     BId - int
A1 - int           \->  AId - int
A2 - varchar            B6 - varchar
A3 - varchar            B7 - varchar
A4 - varchar            B8 - varchar
A5 - int                B9 - int

したがって、テーブル A のレコードには、フィールド AId、A1、A2、A3、A4、および A5 と、「サブレコード」のリストが含まれます。これは、B.AId が A.AId と一致するテーブル B のレコードのリストです。たとえば、テーブル A には日付/時刻やクライアント ID などのトランザクションのプロパティが含まれ、テーブル B は価格と金額を含む商品のリストを表すことができる、購入トランザクションのリストにすることができます。

レコードの一部が複製されたら。それらは、異なる AId、異なる BId、異なる A4、A5、B8、および B9 を持っています。2 つのレコードを重複させるには、他のすべてのフィールドが一致する必要があります。

したがって、A からの 2 つのレコード X および Y は、次の場合に重複していると見なされます。

  • X.A1 == Y.A1
  • X.A2 == Y.A2
  • AId == X.AId を持つテーブル B のすべてのレコードは、AID == Y.AId を持つ B のすべてのレコードと完全に一致しますが、B8 フィールドと B9 フィールドは除外されます (無視されます)。

少なくともそのような重複レコードの AID を取得する必要があります。せいぜいこれらの重複レコードを削除しますが、レコードのコピーを 1 つだけ残します (どちらでもかまいません)。

次の説明が必要かどうか教えてください。前もって感謝します。

upd: SQL フィドル: http://sqlfiddle.com/#!3/898c8/1

4

2 に答える 2

0
Select a1, Count(CompareField) From (Select a.a1 as a1, a.a1 + a.a2 +  a.a3 + b.b6 + b.b7 as compareField from A inner join b on a.AID = b.AID) z Group by z.comparefield

これにより、すべての重複のリストが取得され、外部クエリを使用してレコードを削除できます。DeleteFrom a Where AID in(prevquery)

おそらく述べる必要はありませんが、削除クエリを実行する前に、必ずデータベースをバックアップしてください。:)

于 2012-12-13T16:50:55.227 に答える
0

秘訣は、テーブル B の複数の行を単一の文字列に連結することです。

SQL サーバーの場合、XML 機能を悪用できます (値に特殊文字が含まれていると問題になる可能性があります。Sybase では LIST() のような組み込み関数があり、カンマ区切りのリストを返すものもあります):

SELECT AID, A1, A2, A3, (
  SELECT B6, B7
  FROM B
  WHERE AID=A.AID
  ORDER BY B6, B7
  FOR XML RAW
) XML
FROM A

http://sqlfiddle.com/#!3/898c8/29/0

これで、フラットなテーブルができて、重複を簡単に見つけて削除できます (これは、読者の課題として残しておきます)...

于 2013-10-28T09:50:35.127 に答える