具有多个联接的SQL删除
我有一些很有挑战性的删除语句需要帮助。我正在尝试删除同一个表上具有多个联接的多个重复记录 下面是我的数据示例 versionidPK FileIDFK Version DeleteDate DeleteIndicator 我需要删除的数据是与FileId和版本匹配的所有重复数据,其中DeleteDate小于2011年1月4日,DeleteIndicator=1。但是,我需要在具有相同文件ID和版本的重复数据中保留最高版本ID 删除后,我将保留以下内容: versionidPK FileIDFK Version DeleteDate DeleteIndicator 我有一个选择w/多个连接,可以提供上述记录。我只是不知道如何把它转换成delete语句。这是我的选择声明具有多个联接的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
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)