注册 登录
编程论坛 VFP论坛

删除另表字符包含问题

fdqzy 发布于 2020-09-07 14:55, 2580 次点击
一、删除包含1个字符的记录
create cursor b1 (m c(6))
insert into b1 values ("152")
insert into b1 values ("146")
insert into b1 values ("543")
insert into b1 values ("1654")
insert into b1 values ("54136")

create cursor b2 (m c(2))
insert into b2 values ("3")
insert into b2 values ("2")
在b1中删除包含有b2字符的记录
如"152"中含有"2",删除
"543"中含有"3",删除

二、删除包含2个字符的记录

create cursor b1 (m c(6))
insert into b1 values ("152")
insert into b1 values ("146")
insert into b1 values ("543")
insert into b1 values ("1654")
insert into b1 values ("54136")

create cursor b2 (m1 c(1),m2 c(1))
insert into b2 values ("1","2")
insert into b2 values ("3","1")

如"152"含有"1"和"2"删除
"54136"含有"1"和"3"删除

谢谢!

18 回复
#2
sdta2020-09-07 16:42
create cursor b1 (m c(6))
insert into b1 values ("152")
insert into b1 values ("146")
insert into b1 values ("543")
insert into b1 values ("1654")
insert into b1 values ("54136")

create cursor b2 (m c(2))
insert into b2 values ("3")
insert into b2 values ("2")
DELETE b1 FROM b2 WHERE ALLTRIM(b2.m) $ b1.m
SELECT b1
* PACK && CURSOR 表不能 PACK
BROWSE



create cursor b1 (m c(6))
insert into b1 values ("152")
insert into b1 values ("146")
insert into b1 values ("543")
insert into b1 values ("1654")
insert into b1 values ("54136")

create cursor b2 (m1 c(1),m2 c(1))
insert into b2 values ("1","2")
insert into b2 values ("3","1")

DELETE b1 FROM b2 WHERE b2.m1 $ b1.m AND b2.m2 $ b1.m
SELECT b1
* PACK && CURSOR 表不能 PACK
BROWSE
#3
sdta2020-09-07 16:49
create cursor b1 (m c(6))
insert into b1 values ("152")
insert into b1 values ("146")
insert into b1 values ("543")
insert into b1 values ("1654")
insert into b1 values ("54136")

create cursor b2 (m c(2))
insert into b2 values ("3")
insert into b2 values ("2")
SCAN
    SELECT b1
    SCAN
        DELETE FOR ALLTRIM(b2.m) $ b1.m
    ENDSCAN
ENDSCAN

SELECT b1
* PACK && CURSOR 表不能 PACK
BROWSE

*****************************************************
create cursor b1 (m c(6))
insert into b1 values ("152")
insert into b1 values ("146")
insert into b1 values ("543")
insert into b1 values ("1654")
insert into b1 values ("54136")

create cursor b2 (m1 c(1),m2 c(1))
insert into b2 values ("1","2")
insert into b2 values ("3","1")
SCAN
    SELECT b1
    SCAN
        DELETE FOR b2.m1 $ b1.m AND b2.m2 $ b1.m
    ENDSCAN
ENDSCAN

SELECT b1
* PACK && CURSOR 表不能 PACK
BROWSE
#4
fdqzy2020-09-07 17:20
谢谢版主!!!
#5
fdqzy2020-09-07 18:09
回复 3楼 sdta
版主:
在DELETE b1 FROM b2 WHERE ALLTRIM(b2.m) $ b1.m语句中,如果删除不包含b2.m字符,应怎么写?

如"152"含有"2"不删除
"54136"含有"3"不删除

[此贴子已经被作者于2020-9-7 18:45编辑过]

#6
sdta2020-09-07 18:18
先学基础,再学编程
#7
fdqzy2020-09-07 18:34
回复 6楼 sdta
我用 DELETE b1 FROM b2 WHERE NOT b2.m1 $ b1.m AND b2.m2 $ b1.m
结果全部删除了,
用 DELETE FOR NOT b2.m1 $ b1.m AND b2.m2 $ b1.m
也是全部删除了
SQL语句未学过,惭愧。


[此贴子已经被作者于2020-9-7 18:43编辑过]

#8
sdta2020-09-08 10:03
以下是引用fdqzy在2020-9-7 18:34:28的发言:

我用 DELETE b1 FROM b2 WHERE NOT b2.m1 $ b1.m AND b2.m2 $ b1.m
结果全部删除了,
用 DELETE FOR NOT b2.m1 $ b1.m AND b2.m2 $ b1.m
也是全部删除了
SQL语句未学过,惭愧。

1 insert into b1 values ("152")
包含2,不包含3,所以本条记录被删除
2 insert into b1 values ("146")
同时不包含2、3,所以本条记录被删除
3 insert into b1 values ("543")
包含3,不包含2,所以本条记录被删除
4 insert into b1 values ("1654")
同时不包含2、3,所以本条记录被删除
5 insert into b1 values ("54136")
包含3,不包含2,所以本条记录被删除

通过上面分析,5条记录全部被删除

create cursor b2 (m c(2))
insert into b2 values ("3")
insert into b2 values ("2")
#9
fdqzy2020-09-08 10:25
以下是引用sdta在2020-9-8 10:03:26的发言:


1 insert into b1 values ("152")
包含2,不包含3,所以本条记录被删除
2 insert into b1 values ("146")
同时不包含2、3,所以本条记录被删除
3 insert into b1 values ("543")
包含3,不包含2,所以本条记录被删除
4 insert into b1 values ("1654")
同时不包含2、3,所以本条记录被删除
5 insert into b1 values ("54136")
包含3,不包含2,所以本条记录被删除

通过上面分析,5条记录全部被删除

create cursor b2 (m c(2))
insert into b2 values ("3")
insert into b2 values ("2")

辛苦版主老师,是我没把问题说清楚,条件是不包含“3”或“2”的记录删除。麻烦了。
结果应是“146”和“1654”两条记录被删除。

[此贴子已经被作者于2020-9-8 13:08编辑过]

#10
sdta2020-09-08 10:39
以下是引用fdqzy在2020-9-8 10:25:29的发言:


辛苦版主老师,是我没把问题说清楚,条件是不包含“3”或“2”的记录删除。麻烦了。

8楼的分析是针对5楼的问题回复的,可能我也没说清楚,抱歉!
给出你的问题的正确答案
#11
fdqzy2020-09-08 10:45
回复 10楼 sdta
辛苦了,谢谢!
#12
吹水佬2020-09-08 12:11
b1每条记录的m包含(或不包含)b2所有记录的m(或m1,m2)
#13
fdqzy2020-09-08 13:08
以下是引用吹水佬在2020-9-8 12:11:47的发言:

b1每条记录的m包含(或不包含)b2所有记录的m(或m1,m2)


create cursor b1 (m c(6))
insert into b1 values ("152")
insert into b1 values ("146")
insert into b1 values ("543")
insert into b1 values ("1654")
insert into b1 values ("54136")

create cursor b2 (m c(2))
insert into b2 values ("3")
insert into b2 values ("2")
在b1中删除不包含有b2所有记录的字符
如"152"中含有"2",不删除
"543"中含有"3",不删除
"146"不含b2所有记录,删除
最后结果为:"152","543","54136"的记录
删除"146","1654"的记录
#14
吹水佬2020-09-08 17:14
回复 13楼 fdqzy
是这样的话,参考2、3楼应该好理解,也可以不用DELETE,直接取出所要的数据
#15
fdqzy2020-09-08 17:49
以下是引用吹水佬在2020-9-8 17:14:53的发言:

是这样的话,参考2、3楼应该好理解,也可以不用DELETE,直接取出所要的数据

如何取出不包含b2字符的数据?请指点!
因为b1和b2的记录都多
b1有近10万多条数据

[此贴子已经被作者于2020-9-8 17:54编辑过]

#16
吹水佬2020-09-08 21:19
回复 15楼 fdqzy
10多万条不算多
试试这样可否满足要求
程序代码:
create cursor b1 (m c(6))
insert into b1 values ("152")
insert into b1 values ("146")
insert into b1 values ("543")
insert into b1 values ("1654")
insert into b1 values ("54136")

create cursor b2 (m c(2))
insert into b2 values ("3")
insert into b2 values ("2")

SELECT m FROM b2 INTO ARRAY a2
SELECT * FROM b1 WHERE fun(m)
RETURN

FUNCTION fun(m)
    FOR i=1 TO ALEN(a2)
        IF AT(ALLTRIM(a2[i]),m) > 0
            RETURN .F.
        ENDIF
    ENDFOR
    RETURN .T.
ENDFUNC


[此贴子已经被作者于2020-9-8 21:23编辑过]

#17
sdta2020-09-09 06:27
以下是引用fdqzy在2020-9-8 17:49:02的发言:


如何取出不包含b2字符的数据?请指点!
因为b1和b2的记录都多
b1有近10万多条数据

上传所有数据看看
#18
fdqzy2020-09-09 15:51
回复 16楼 吹水佬
谢谢两位版主 !!
#19
fdqzy2020-09-09 20:23
其实也可以这样操作:
复制b1为b3
用2楼的办法删除包含相同字符的记录
再在b3中删除上面保留的记录
语句也只有两名,也避免了b1因数据量大编程费时间的问题.
再次感谢两位老师!!!
1