标题:如何在SELECT... FROM... WHERE代码中增加识别新旧功能
只看楼主
cluna2013
Rank: 1
等 级:新手上路
帖 子:206
专家分:0
注 册:2013-3-2
结帖率:100%
已结贴  问题点数:20 回复次数:11 
如何在SELECT... FROM... WHERE代码中增加识别新旧功能
各位朋友好!
下面是程序根据时间差异找出需要更新的文件
SELECT files1.* FROM files1 WHERE !files1.修改时间 in (SELECT 修改时间 FROM files2)
问题:更新显然是用新修改的文件替换旧文件,但是当files2.*的文件比files1.*还要新的时候,这段代码缺少时间新旧比较,会将旧文件替换新文件。
求助:如何修改该代码使之避免以旧换新?
搜索更多相关主题的帖子: 修改 SELECT FROM 文件 代码 
2022-09-20 13:00
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:5 
根据什么确定文件是新或旧
2022-09-20 17:32
cluna2013
Rank: 1
等 级:新手上路
帖 子:206
专家分:0
注 册:2013-3-2
得分:0 
以下是引用吹水佬在2022-9-20 17:32:57的发言:

根据什么确定文件是新或旧

谢谢吹水佬关注,我还以为此问题没解了
CREATE TABLE files0 (子目录 C(28), 文件名 C(140), 文件大小 N(12), 修改时间 T)
根据修改时间。
2022-09-21 07:04
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:15 
m.older = 'files1'
m.newer = 'files2'

SELECT a.* FROM (m.newer) a ;
    inner join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where a.修改时间 > b.修改时间

如果希望同时包括 files2 中有,files1 中没有的,这样:

SELECT a.* FROM (m.newer) a ;
    left join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where (a.修改时间 > b.修改时间) or (b.文件名 is null)


[此贴子已经被作者于2022-9-21 07:52编辑过]

2022-09-21 07:39
cluna2013
Rank: 1
等 级:新手上路
帖 子:206
专家分:0
注 册:2013-3-2
得分:0 
以下是引用csyx在2022-9-21 07:39:44的发言:

m.older = 'files1'
m.newer = 'files2'

SELECT a.* FROM (m.newer) a ;
    inner join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where a.修改时间 > b.修改时间

如果希望同时包括 files2 中有,files1 中没有的,这样:

SELECT a.* FROM (m.newer) a ;
    left join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where (a.修改时间 > b.修改时间) or (b.文件名 is null)

成功了,谢谢!
2022-09-21 08:39
cluna2013
Rank: 1
等 级:新手上路
帖 子:206
专家分:0
注 册:2013-3-2
得分:0 
以下是引用csyx在2022-9-21 07:39:44的发言:

m.older = 'files1'
m.newer = 'files2'

SELECT a.* FROM (m.newer) a ;
    inner join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where a.修改时间 > b.修改时间

如果希望同时包括 files2 中有,files1 中没有的,这样:

SELECT a.* FROM (m.newer) a ;
    left join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where (a.修改时间 > b.修改时间) or (b.文件名 is null)

恁提供的代码
SELECT a.* FROM (m.newer) a ;
    left join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where (a.修改时间 > b.修改时间) or (b.文件名 is null)
最后部分or (b.文件名 is null)在运转中会把所有的文件都算上;没有这一块,又会漏掉新文件。有没有其他办法?
2022-09-21 15:10
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
没明白“所有文件都算上”是什么情况,列举两三个这种情况的文件看看
2022-09-21 15:23
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
如果分开查询的结果没问题,就两个分开的查询结果联合起来

SELECT a.* FROM (m.newer) a ;
    inner join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where a.修改时间 > b.修改时间 ;
union ;
SELECT a.* FROM (m.newer) a ;
    left join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where b.文件名 is null
2022-09-21 17:23
cluna2013
Rank: 1
等 级:新手上路
帖 子:206
专家分:0
注 册:2013-3-2
得分:0 
以下是引用csyx在2022-9-21 17:23:22的发言:

如果分开查询的结果没问题,就两个分开的查询结果联合起来

SELECT a.* FROM (m.newer) a ;
    inner join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where a.修改时间 > b.修改时间 ;
union ;
SELECT a.* FROM (m.newer) a ;
    left join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where b.文件名 is null

评价:
第一
SELECT files1.* FROM files1 WHERE !files1.修改时间 in (SELECT 修改时间 FROM files2)
这段代码速度非常快,但是不能辨别时间差异究竟哪个是新的,所以有风险;另外,如果相同的文件放在不同的子目录中,它也会忽视;
第二
m.older = 'files1'
m.newer = 'files2'
SELECT a.* FROM (m.newer) a ;
    inner join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where a.修改时间 > b.修改时间
这段代码使用==达到精准的效果,不过速度明显变慢,也会无视新增加的文件;
第三
SELECT a.* FROM (m.newer) a ;
    left join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where (a.修改时间 > b.修改时间) or (b.文件名 is null)
或者
SELECT a.* FROM (m.newer) a ;
    inner join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where a.修改时间 > b.修改时间 ;
union ;
SELECT a.* FROM (m.newer) a ;
    left join (m.older) b on a.子目录 == b.子目录 and a.文件名 == b.文件名 ;
    where b.文件名 is null
只要把b.文件名 is null加上去,就会出现更新一样的文件、并且修改时间也一样!

[此贴子已经被作者于2022-9-22 09:24编辑过]

2022-09-22 09:19
cluna2013
Rank: 1
等 级:新手上路
帖 子:206
专家分:0
注 册:2013-3-2
得分:0 
???

[此贴子已经被作者于2022-9-22 13:35编辑过]

2022-09-22 09:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-510098-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.125067 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved