Sql 删除没有最高版本和修订的数据集
我想完成与之相反的任务 对于这个问题,我有一个数据库表,其中包含四列: 身份证件 文件编号 修订 版本 每个文档有1..n个版本,每个版本有1..n个版本 我删除文档的SQL语句是什么 相同的文件编号和版本,但存在更高版本 或者存在相同的文件编号和更高版本,包括所有版本Sql 删除没有最高版本和修订的数据集,sql,ms-access,Sql,Ms Access,我想完成与之相反的任务 对于这个问题,我有一个数据库表,其中包含四列: 身份证件 文件编号 修订 版本 每个文档有1..n个版本,每个版本有1..n个版本 我删除文档的SQL语句是什么 相同的文件编号和版本,但存在更高版本 或者存在相同的文件编号和更高版本,包括所有版本 ID Doc-No Rev Vers Should be deleted? 1 Dok1 01 01 yes, because same Doc-No higher rev exists 2 Dok1 0
ID Doc-No Rev Vers Should be deleted?
1 Dok1 01 01 yes, because same Doc-No higher rev exists
2 Dok1 01 02 yes, because same Doc-No higher rev exists
3 Dok1 01 03 yes, because same Doc-No higher rev exists
4 Dok1 02 01 yes, because same Doc-No and a higher vers for this rev exists
5 Dok1 02 02 no, because Rev 02 / V02 is the highest for Doc-No Dok1
6 Dok2 01 01 yes, because same Doc-No higher rev exists
7 Dok2 02 01 yes, because same Doc-No higher rev exists
8 Dok2 03 01 no, because Rev 03 / V01 is the highest for Doc-No Dok2
你可以做:
delete from t
where t.id <> (select top (1) t2.id
from t as t2
where t2.doc_no = t.doc_num
order by t2.version desc, t2.revision desc, t2.id desc
);
当然,在尝试这样的删除之前,请备份该表。您可以执行以下操作:
delete from t
where t.id <> (select top (1) t2.id
from t as t2
where t2.doc_no = t.doc_num
order by t2.version desc, t2.revision desc, t2.id desc
);
当然,在尝试这样的删除之前,请备份该表。以下操作应能达到预期效果:
delete from Table1 t1
where exists
(
select 1 from Table1 t2
where
t1.[Doc-No] = t2.[Doc-No] and
(
t1.Rev < t2.Rev or
(t1.Rev = t2.Rev and t1.Vers < t2.Vers)
)
)
将表更改为表的名称以及与数据不匹配的任何其他字段
始终在运行删除查询之前备份数据-没有撤消 以下各项应达到预期效果:
delete from Table1 t1
where exists
(
select 1 from Table1 t2
where
t1.[Doc-No] = t2.[Doc-No] and
(
t1.Rev < t2.Rev or
(t1.Rev = t2.Rev and t1.Vers < t2.Vers)
)
)
将表更改为表的名称以及与数据不匹配的任何其他字段
始终在运行删除查询之前备份数据-没有撤消 如果对修订和版本级别的两个聚合查询进行内部联接,而不是关联子查询,则原始的顶级修订和顶级版本查询将更加高效。前者为外部查询中的所有行计算一次,后者为每行计算一次: 将DELETE翻译为:
对于修订和版本级别的两个聚合查询,如果使用内部联接,而不是相关子查询,则原始的顶级修订和顶级版本查询将更加高效。前者为外部查询中的所有行计算一次,后者为每行计算一次: 将DELETE翻译为:
感谢您的快速响应,但我在m y MS Access SQL编辑器中粘贴时遇到语法错误。在其中t2.doc_no=t.doc_num,我假设doc_no和doc_num必须都是doc_no?@StefanMeyer。查询实际上应该使用数据库中的列和表的实际名称。感谢您的快速响应,但在m y MS Access SQL编辑器中粘贴时出现语法错误。在其中t2.doc_no=t.doc_num,我假设doc_no和doc_num必须都是doc_no?@StefanMeyer。查询实际上应该使用数据库中列和表的实际名称。若早期版本包含比最新版本更高的版本,例如版本1第3版和版本2第2版,则第一个示例不会返回结果;MaxRev=2,MaxVer=3,但这并不存在。这一点很好@LeeMac。使用两个agg查询联接进行相应调整。谢谢如果早期版本包含比最新版本更高的版本,例如版本1第3版和版本2第2版,则第一个示例不会返回结果;MaxRev=2,MaxVer=3,但这并不存在。这一点很好@LeeMac。使用两个agg查询联接进行相应调整。谢谢