| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2338 人关注过本帖, 1 人收藏
标题:请大神指导查询,比对问题
只看楼主 加入收藏
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10575
专家分:43038
注 册:2014-5-20
收藏
得分:0 
以下是引用aaaaaa在2015-10-27 21:30:06的发言:

还没有完全理解题意
如果 表1里有 05621,算包含在表2里的 005 的吗?

应该不算。
5个独立单号码来的,其中任选3个。
2015-10-27 21:34
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
我再理顺一下思路,有点复杂。

[此贴子已经被作者于2015-10-27 22:03编辑过]


民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2015-10-27 21:57
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:2 
楼主真相信自己能中大奖?知道彩票是怎么开的奖吗?
2015-10-27 22:11
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3146
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用aaaaaa在2015-10-27 21:30:06的发言:

还没有完全理解题意
如果 表1里有 05621,算包含在表2里的 005 的吗?

不算,他要的是表2的每个数都在表1中,包括重复的,如果是重复的,就你当他不是重复的来处理
吹版主,在处理的时候,用了个很巧妙的方法,对于表1,不管你重不重复,先按顺序排起来,同样,表2,也是按顺序排起来。
但对于表2,你不能简单的按顺序排起来的。比如
表1=03584,表2=805,我们用眼看就知道,表2在表1中,表1排序后=03458,表2排序后=058,
?LIKE('058','03458') && .F.
吹版,就在058中间,插入通配符“*”,为什么不用“?”,用“*”表示0以5之间可以是多个其他字符,而用“?”只能是1个字符
也就是说
?LIKE('?0?5?8?','03458') && .F.
?LIKE('*0*5*8*','03458') && .T.

2015-10-28 09:34
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
不知道对不对,最好样本数据多一些,可以测试速度和正确率。
应该可以用一句 Select-SQL 语句的,但效率不一定快。
下面的试试看:

*!*    表3 : 包含,Query : 不包含:
Clear
Create Cursor 表1 (序号 I, 结果 V(5))
Insert Into 表1 Values(1, "05601")
Insert Into 表1 Values(2, "47896")
Insert Into 表1 Values(3, "81222")
Insert Into 表1 Values(4, "48068")
Insert Into 表1 Values(5, "54969")
*!*    Insert Into 表1 Values(1, "05621")
Create Cursor 表2 (序号 I, 结果 V(3))
Insert Into 表2 Values(1, "005")
Insert Into 表2 Values(2, "048")
Insert Into 表2 Values(3, "128")
Insert Into 表2 Values(4, "379")
Insert Into 表2 Values(5, "468")

Select *, 00000 As 序号2, "   " As 包含 From 表1 Readwrite Into Cursor 表3

Select 表2
Scan
    Select 表3
    Replace All 表3.序号2 With 表2.序号, 表3.包含 With 表2.结果 For (;
        Occurs(Substr(表2.结果, 1, 1), 表3.结果) >= Occurs(Substr(表2.结果, 1, 1), 表2.结果) And ;
        Occurs(Substr(表2.结果, 2, 1), 表3.结果) >= Occurs(Substr(表2.结果, 2, 1), 表2.结果) And ;
        Occurs(Substr(表2.结果, 3, 1), 表3.结果) >= Occurs(Substr(表2.结果, 3, 1), 表2.结果) ) And ;
        Empty(表3.包含)
    Select 表2
Endscan
Select 表3
Go Top
Browse Last Nowait
Select 序号, 结果 As 不包含 From 表2 Where 结果 Not In (Select 包含 From 表3)

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2015-10-28 12:40
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27162
注 册:2012-2-5
收藏
得分:0 
occurs()查询最耗时间,特别是用在SQL命令中

坚守VFP最后的阵地
2015-10-28 14:09
wjx6769
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2015-10-26
收藏
得分:0 
都是大神啊!!厉害。

回33楼taifu945:我不是为了中大奖,双色球和大乐透我计算过,1千7百多万种的组合,每年就开152-154期,这是大海捞针,不用去计算了,没意义。中这样的大奖,靠的是命。命里有终须有。随便买几注,不换号,中了就是命。要计算,只能用其他方法,比如多个蓝球+多个红球的组合,这里就不累述了。我现在研究这个时时彩也不是中最大奖的那个,选择的是适中的玩法,奖金也适中,像之前说的,不贪心,每天赚点菜钱还是有一定可能的。

大家都考虑到号码里有重复的问题,我已经剔除了0-9组成的3位数的重复情况(在27楼有数据),就是想简化这个过程,那么,开奖结果里有重复是没关系的,反而是好事,比如:开奖结果是
08065,如果买的号码是058,那么,相当于中了个2倍的奖,08065里含有2个058,多的1倍就是额外收获。同理,这注里有2个056、068。但是只有1个568。

所以,开奖结果是否有重复不重要,重要的是开奖结果里是否包含有表2(0-9组成的不重复的3位数(120个号))。如果在一定期数里,还有没开出来的3位数,那么我就可以考虑买这个3位数,按照一定的比例追着买一定的期数。出了,就中奖了。
2015-10-28 15:16
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10575
专家分:43038
注 册:2014-5-20
收藏
得分:0 
测试了一下,用OCCURS()比用LIKE()快好多,这样更快些。
Clear
Create Cursor 表1 (序号 I, 结果 V(5))
FOR i = 1 TO 1000
Insert Into 表1 Values(1, "05601")
Insert Into 表1 Values(2, "47896")
Insert Into 表1 Values(3, "81222")
Insert Into 表1 Values(4, "48068")
Insert Into 表1 Values(5, "54969")
ENDFOR

Create Cursor 表2 (序号 I, 结果 V(3), 不包含 L)
FOR i = 1 TO 100
Insert Into 表2 Values(1, "005", .F.)
Insert Into 表2 Values(2, "048", .F.)
Insert Into 表2 Values(3, "128", .F.)
Insert Into 表2 Values(4, "379", .F.)
Insert Into 表2 Values(5, "468", .F.)
ENDFOR

t1=DATETIME()
SELECT 表2
SCAN
    不包含 = .T.
    SELECT 表1
    SCAN
        IF OCCURS(SUBSTR(表2.结果,1,1), 表1.结果) >= OCCURS(SUBSTR(表2.结果,1,1), 表2.结果) AND;
           OCCURS(SUBSTR(表2.结果,2,1), 表1.结果) >= OCCURS(SUBSTR(表2.结果,2,1), 表2.结果) AND;
           OCCURS(SUBSTR(表2.结果,3,1), 表1.结果) >= OCCURS(SUBSTR(表2.结果,3,1), 表2.结果)
            不包含 = .F.
            EXIT
        ENDIF
    ENDSCAN
    IF 不包含
        REPLACE 不包含 WITH .T. IN "表2"
    ENDIF
ENDSCAN
?DATETIME()-t1
SELECT 表2
BROWSE FOR 不包含
2015-10-28 15:17
hgfeng1984
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:139
专家分:513
注 册:2006-3-26
收藏
得分:0 
不知道AT()的速度怎么样。
1.表1,表2全连接
2.取表2 第一位 AT()比较 表1,存在返回1,不存在返回0,判断3次。
3.取重复出现3次的结果表与表2比较,输出结果。

clear
 *表1
 CREATE CURSOR T1(xh INT,jg C(10))
 INSERT INTO T1(xh,jg) VALUES(1,'05601')
 INSERT INTO T1(xh,jg) VALUES(2,'47896')
 INSERT INTO T1(xh,jg) VALUES(3,'81222')
 INSERT INTO T1(xh,jg) VALUES(4,'48068')
 INSERT INTO T1(xh,jg) VALUES(5,'54969')

 *表2
 CREATE CURSOR T2(xh INT,jg C(10))
 INSERT INTO T2(xh,jg) VALUES(1,'005')
 INSERT INTO T2(xh,jg) VALUES(2,'048')
 INSERT INTO T2(xh,jg) VALUES(3,'128')
 INSERT INTO T2(xh,jg) VALUES(4,'379')
 INSERT INTO T2(xh,jg) VALUES(5,'468')

 
SELECT T2.jg FROM T2 WHERE T2.jg NOT in (SELECT b.jg FROM T1 A,T2 B WHERE IIF(AT(SUBSTR(b.jg,1,1),a.jg)>0,1,0)+IIF(AT(SUBSTR(b.jg,2,1),a.jg)>0,1,0)+IIF(AT(SUBSTR(b.jg,3,1),a.jg)>0,1,0)=3)
2015-10-28 15:19
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10575
专家分:43038
注 册:2014-5-20
收藏
得分:0 
用AT(SUBSTR(b.jg,1,1),a.jg)>0,1,0)会出现重复计算问题。
如:将表1的'05601'改为'05611',这时表2的'005'没找出来。
2015-10-28 15:49
快速回复:请大神指导查询,比对问题
数据加载中...
 
   



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

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