标题:SQL 随机筛选条件的问题(问题解决)
只看楼主
乐山一虫
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-12-5
 问题点数:0 回复次数:5 
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]]
搜索更多相关主题的帖子: SQL 条件 筛选 随机 
2008-12-06 08:49
乐山一虫
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-12-5
得分:0 
我自已捣鼓了2天,想按上面两位大虾的思路用CASE WHEN或IF语句来做,可是没弄出来,也许是我的语法不对,特来请教。
2008-12-06 08:55
jacksonchina
该用户已被删除
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2008-12-08 15:21
乐山一虫
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-12-5
得分:0 
回复 第3楼 jacksonchina 的帖子
不行,zb中没有ROWID,只有a,b,c,d,e这5个字段,并且这5个字段都有重复值,不能设成主键。
2008-12-08 18:15
球球
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:1146
专家分:265
注 册:2005-11-28
得分:0 
给一个不是最好的答案,期待中。。。
SELECT * FROM
(
SELECT z.* FROM zb z,fb f WHERE z.a-z.b-z.c=f.a-f.b-f.c
UNION ALL
SELECT z.* FROM zb z,fb f WHERE z.b-z.c-z.d=f.b-f.c-f.d
UNION ALL
SELECT z.* FROM zb z,fb f WHERE z.c-z.d-z.e=f.c-f.d-f.e
UNION ALL
SELECT z.* FROM zb z,fb f WHERE z.d-z.e-z.a=f.d-f.e-f.a
UNION ALL
SELECT z.* FROM zb z,fb f WHERE z.e-z.a-z.b=f.e-f.a-f.b
......
) t GROUP BY t.a,t.b,t.c,t.d,t.e HAVING COUNT(1)>=4

好累
2008-12-10 13:22
乐山一虫
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-12-5
得分:0 
itput论坛的newkid大虾提供的方法:

我提供另外一种方法:
创建一张系数表:
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
                 )
2008-12-11 21:08



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




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

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