SQL 随机筛选条件的问题(问题解决)
各位大虾,我刚学SQL时间不长,现在遇到这样一个问题:有两个表,zb和fb,zb有几千条记录,fb只有一条记录,两个表的记录都为数字,
现在有下面30个条件,目的是把满足其中4个条件的记录从zb中筛选显示出来,等号
前面是zb算式.我编了一个笨程序,四个一组全部排出来,大小有47kb,太麻烦了,
想求一个简单的方法,请各位大虾帮帮忙.
a-b-c=(select a-b-c from fb)
b-a-c=(select b-a-c from fb)
c-a-b=(select c-a-b from fb)
a-b-d=(select a-b-d from fb)
b-a-d=(select b-a-d from fb)
d-a-b=(select d-a-b from fb)
a-b-e=(select a-b-e from fb)
b-a-e=(select b-a-e from fb)
e-a-b=(select e-a-b from fb)
a-c-d=(select a-c-d from fb)
c-a-d=(select c-a-d from fb)
d-a-c=(select d-a-c from fb)
a-c-e=(select a-c-e from fb)
c-a-e=(select c-a-e from fb)
e-a-c=(select e-a-c from fb)
a-d-e=(select a-d-e from fb)
d-a-e=(select d-a-e from fb)
e-a-d=(select e-a-d from fb)
b-c-d=(select b-c-d from fb)
c-b-d=(select c-b-d from fb)
d-b-c=(select d-b-c from fb)
b-c-e=(select b-c-e from fb)
c-b-e=(select c-b-e from fb)
e-b-c=(select e-b-c from fb)
b-d-e=(select b-d-e from fb)
d-b-e=(select d-b-e from fb)
e-b-d=(select e-b-d from fb)
c-d-e=(select c-d-e from fb)
d-c-e=(select d-c-e from fb)
e-c-d=(select e-c-d from fb)
两个表都是5个字段,记录全是数字.比如zb中a=100,b=20,c=30,d=50,e=200,fb中a=300,b=100,c=150,d=60,e=330,
zb中a-b-c=50=b表a-b-c,这样就满足第一个条件,zb中e-c-d=120=fb中e-c-d,这样就满足最后一个条件,把同时满足这样4个条件的记录从zb中显示出来.
在一个网站上发了求助贴子,有两个大虾给出了这样的答案
1.
SELECT Fb.*
FROM Fb, Zb
WHERE Decode(Fb.a - Fb.b - Fb.c, Zb.a - Zb.b - Zb.c, 1, 0) + Decode(Fb.b - Fb.a - Fb.c, Zb.b - Zb.a - Zb.c, 1, 0) +
Decode(Fb.c - Fb.a - Fb.b, Zb.c - Zb.a - Zb.b, 1, 0) + Decode(Fb.a - Fb.b - Fb.d, Zb.a - Zb.b - Zb.d, 1, 0) +
Decode(Fb.b - Fb.a - Fb.d, Zb.b - Zb.a - Zb.d, 1, 0) + Decode(Fb.d - Fb.a - Fb.b, Zb.d - Zb.a - Zb.b, 1, 0) +
Decode(Fb.a - Fb.b - Fb.e, Zb.a - Zb.b - Zb.e, 1, 0) + Decode(Fb.b - Fb.a - Fb.e, Zb.b - Zb.a - Zb.e, 1, 0) +
Decode(Fb.e - Fb.a - Fb.b, Zb.e - Zb.a - Zb.b, 1, 0) + Decode(Fb.a - Fb.c - Fb.d, Zb.a - Zb.c - Zb.d, 1, 0) +
Decode(Fb.c - Fb.a - Fb.d, Zb.c - Zb.a - Zb.d, 1, 0) + Decode(Fb.d - Fb.a - Fb.c, Zb.d - Zb.a - Zb.c, 1, 0) +
Decode(Fb.a - Fb.c - Fb.e, Zb.a - Zb.c - Zb.e, 1, 0) + Decode(Fb.c - Fb.a - Fb.e, Zb.c - Zb.a - Zb.e, 1, 0) +
Decode(Fb.e - Fb.a - Fb.c, Zb.e - Zb.a - Zb.c, 1, 0) + Decode(Fb.a - Fb.d - Fb.e, Zb.a - Zb.d - Zb.e, 1, 0) +
Decode(Fb.d - Fb.a - Fb.e, Zb.d - Zb.a - Zb.e, 1, 0) + Decode(Fb.e - Fb.a - Fb.d, Zb.e - Zb.a - Zb.d, 1, 0) +
Decode(Fb.b - Fb.c - Fb.d, Zb.b - Zb.c - Zb.d, 1, 0) + Decode(Fb.c - Fb.b - Fb.d, Zb.c - Zb.b - Zb.d, 1, 0) +
Decode(Fb.d - Fb.b - Fb.c, Zb.d - Zb.b - Zb.c, 1, 0) + Decode(Fb.b - Fb.c - Fb.e, Zb.b - Zb.c - Zb.e, 1, 0) +
Decode(Fb.c - Fb.b - Fb.e, Zb.c - Zb.b - Zb.e, 1, 0) + Decode(Fb.e - Fb.b - Fb.c, Zb.e - Zb.b - Zb.c, 1, 0) +
Decode(Fb.b - Fb.d - Fb.e, Zb.b - Zb.d - Zb.e, 1, 0) + Decode(Fb.d - Fb.b - Fb.e, Zb.d - Zb.b - Zb.e, 1, 0) +
Decode(Fb.e - Fb.b - Fb.d, Zb.e - Zb.b - Zb.d, 1, 0) + Decode(Fb.c - Fb.d - Fb.e, Zb.c - Zb.d - Zb.e, 1, 0) +
Decode(Fb.d - Fb.c - Fb.e, Zb.d - Zb.c - Zb.e, 1, 0) + Decode(Fb.e - Fb.c - Fb.d, Zb.e - Zb.c - Zb.d, 1, 0) >= 4
2.
创建一张系数表:
CREATE TABLE coefficients (c_a number,c_b number,c_c number,c_d number,c_e number);
公式系数无非是三种之一: -1, 0, 1
比如a-b-c就是: (1,-1,-1,0,0)
把所有公式的系数插入到coefficients
SELECT *
FROM zb
WHERE ROWID IN ( SELECT zb.ROWID
FROM zb,fb,coefficients co
WHERE zb.a*c_a+zb.b*c_b+zb.c*c_c+zb.d*c_d+zb.e*c_e = fb.a*c_a+fb.b*c_b+fb.c*c_c+fb.d*c_d+fb.e*c_e
GROUP BY zb.ROWID
HAVING COUNT(*)>=4
一试,不行,Decode是ORACLE的函数,而我用的是sql sever, 在答案2中我把number改成decimal,可执行后却提示
服务器: 消息 170,级别 15,状态 1,行 7
第 7 行: '4' 附近有语法错误。
请高手指点。
[[it] 本帖最后由 乐山一虫 于 2008-12-11 21:08 编辑 [/it]]