Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有多个联接的SQL删除_Sql_Sql Server 2008 - Fatal编程技术网

具有多个联接的SQL删除

具有多个联接的SQL删除,sql,sql-server-2008,Sql,Sql Server 2008,我有一些很有挑战性的删除语句需要帮助。我正在尝试删除同一个表上具有多个联接的多个重复记录 下面是我的数据示例 versionidPK FileIDFK Version DeleteDate DeleteIndicator 我需要删除的数据是与FileId和版本匹配的所有重复数据,其中DeleteDate小于2011年1月4日,DeleteIndicator=1。但是,我需要在具有相同文件ID和版本的重复数据中保留最高版本ID 删除后,我将保留以下内容: versionidPK FileIDFK

我有一些很有挑战性的删除语句需要帮助。我正在尝试删除同一个表上具有多个联接的多个重复记录

下面是我的数据示例

versionidPK FileIDFK Version DeleteDate DeleteIndicator 我需要删除的数据是与FileId和版本匹配的所有重复数据,其中DeleteDate小于2011年1月4日,DeleteIndicator=1。但是,我需要在具有相同文件ID和版本的重复数据中保留最高版本ID

删除后,我将保留以下内容:

versionidPK FileIDFK Version DeleteDate DeleteIndicator 我有一个选择w/多个连接,可以提供上述记录。我只是不知道如何把它转换成delete语句。这是我的选择声明

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

我所需要做的就是把我拥有的变成一个delete语句。对不起,如果我的文本格式都搞砸了,这是我第一次在这里发布。任何帮助都将非常感谢您的时间。

只需将您的查询用作子查询,但只选择一个PK字段版本ID:

Delete from tblFileVersions where 
versionid NOT IN (select t.VersionID from tblFileVersions t Join...CONTINUE YOUR QUERY HERE......)

要做到这一点,最简单的方法是:

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) 

我很困惑。我是否在t别名之前取出t.fileid和t.version,count*?您应该删除所有具有versionId的行,而不是从您的查询中删除,因此只使用您的查询输出versionId,而不输出其他字段。做得好,谢谢,这很有效。实际上,我不得不将查询中不存在的Where VersionID更改为查询中的,因为我正在获取所有要删除的版本。再次感谢!!!!你在附近,这不是一个很大的帮助:
Delete from tblFileVersions where 
versionid NOT IN (select t.VersionID from tblFileVersions t Join...CONTINUE YOUR QUERY HERE......)
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)