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 小于 04/01/2011 且 DeleteIndicator 为 = 1 的版本匹配的所有重复数据。但是,我需要将最高版本 ID 保留在重复数据之外相同的 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  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:

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