Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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_Ms Access - Fatal编程技术网

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

我想完成与之相反的任务

对于这个问题,我有一个数据库表,其中包含四列:

身份证件 文件编号 修订 版本 每个文档有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   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查询联接进行相应调整。谢谢