0

助けが必要な、やりがいのある削除ステートメントがいくつかあります。同じテーブルで複数の結合を持つ複数の重複レコードを削除しようとしています。

これが私のデータの例です

versionid(PK)FileID(FK)バージョンDeleteDate DeleteIndicator

   1              1         1      12/01/2003        1
   2              1         1      12/02/2003        1 
   3              1         1         null           0
   4              2         2      01/02/2004        1
   5              2         2      01/03/2005        1
   6              2         2      01/03/2006        1

削除する必要のあるデータは、FileIdとバージョンが一致するすべての重複データです。DeleteDateは2011年4月1日未満で、DeleteIndicatorは1です。ただし、重複データから最も高いVersionIDを除外する必要があります。同じFileIdとバージョン

削除後、私はこれを残しておきます:

versionid(PK)FileID(FK)バージョンDeleteDate DeleteIndicator

  2              1         1      12/02/2003        1 
  3              1         1         null           0
  6              2         2      01/03/2006        1

上記のレコードを取得する複数の結合を使用した選択があります。それを削除ステートメントに変換する方法がわかりません。これが私のselectステートメントです。

SELECT  t.VersionID ,
    t.FileID ,
    t.version ,
    COUNT(*) ,
    t.DeleteDate ,
    t.DeleteIndicator
FROM    tblFileVersions t
    JOIN ( SELECT   VersionID ,
                    FileID ,
                    MAX(VersionID) AS MaxVersion ,
                    DeleteDate ,
                    DeleteIndicator
           FROM     tblFileVersions
           GROUP BY VersionID ,
                    FileID ,
                    DeleteDate ,
                    DeleteIndicator
         ) x ON t.FileID = x.FileID
WHERE   t.DeleteDate < '2011/04/01'
    AND t.DeleteIndicator = 1
    AND t.VersionID < MaxVersion
GROUP BY t.VersionID ,
    t.FileID ,
    t.version ,
    t.DeleteDate ,
    t.DeleteIndicator ,
    Version
HAVING  COUNT(*) > 1

私がする必要があるのは、私が持っているものを取り、それを削除ステートメントにすることです。私のテキストフォーマットがすべて台無しになっている場合は申し訳ありませんが、これは私がここに投稿するのは初めてです。どんな助けでもあなたの時間に大いに感謝するでしょう。

4

2 に答える 2

1

それを簡単にする最も簡単な方法:

DELETE FROM tblFileVersions 
WHERE VersionID NOT IN (SELECT  t.VersionID
FROM    tblFileVersions t
    JOIN ( SELECT   VersionID ,
                    FileID ,
                    MAX(VersionID) AS MaxVersion ,
                    DeleteDate ,
                    DeleteIndicator
           FROM     tblFileVersions
           GROUP BY VersionID ,
                    FileID ,
                    DeleteDate ,
                    DeleteIndicator
         ) x ON t.FileID = x.FileID
WHERE   t.DeleteDate < '2011/04/01'
    AND t.DeleteIndicator = 1
    AND t.VersionID < MaxVersion
GROUP BY t.VersionID ,
    t.FileID ,
    t.version ,
    t.DeleteDate ,
    t.DeleteIndicator ,
    Version
HAVING  COUNT(*) > 1) 
于 2012-08-28T12:30:09.670 に答える
0

クエリをサブクエリとして使用するだけで、PK フィールド versionID を 1 つだけ選択します。

Delete from tblFileVersions where 
versionid NOT IN (select t.VersionID from tblFileVersions t Join...CONTINUE YOUR QUERY HERE......)
于 2012-08-28T12:30:01.777 に答える