能否用SQL查询语句实现入下功能的查询(困扰我好多年了)

s198127 2005-04-17 01:16:42
有如下的5字段表
序列号(该字段的值唯一) 字段A 字段B 字段C 字段D
.......................................................
1 3 4 5 6
2 4 5 6 7
3 5 6 7 8
4 6 7 8 9
.......................................................

现在我期望能实现的功能是:
能否用语句查找出同时出现过(5,6)的记录
当然对于以上的数据应该返回的结果是:
序列号(该字段的值唯一) 字段A 字段B 字段C 字段D
.......................................................
1 3 4 5 6
2 4 5 6 7
3 5 6 7 8
.......................................................

但对于未知数据集的情况下该语句该如何写哪??
重点是我不知道这些要求的条件(5,6)究竟会在哪个字段位置上出现
...全文
228 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
s198127 2005-04-18
  • 打赏
  • 举报
回复
to long_bow(snoopy)
首先感谢你的提议,但这种方法会把结果集扩,例如:
字段A 字段B
55 66
当出现这种情况的时候使用"||"方法就会产生不少的错误数据.

to tangtangno1(糖糖)
首先感谢你的提议
这种方法比枚举法看起来清晰不少.
但是你的条件好象有问题哦!
decode(col1,5,1,decode(col1,6,10,0))+decode(col2,5,1,decode(col2,6,10,0))+decode(col3,5,1,decode(col3,6,10,0))+decode(col4,5,1,decode(col4,6,10,0))=11

应该还有:
decode(col1,5,1,decode(col1,6,10,0))+decode(col2,5,1,decode(col2,6,10,0))+decode (col3,5,1,decode(col3,6,10,0))+decode(col4,5,1,decode(col4,6,10,0))in(11,12,22,13,21)
可能还有....

to Hewwatt(Hewwatt)
首先感谢你的批评,我虚心接受.
不过用户难免会有对系统的期望值过高的时候,
我们能做的也不是完全满足用户而是尽量满足.
ojaoja 2005-04-18
  • 打赏
  • 举报
回复
这么复杂的语句,数据量一大运行就十分缓慢了,枚举办法不可取。
换种思路,可以想想使用触发器,在执行insert和update后立刻判断新加入的一行是否满足条件,然后把其抄写到临时表中,这样可以直接获得答案,不过负面影响也较严重--事务处理会有所减慢,如果目标表上没有集中式的批量数据处理就可以采用这种办法。
Croatia 2005-04-18
  • 打赏
  • 举报
回复
1。你不知道在哪一个上面会有。那就直接把他们都连起来,作为一个字符来操作。这样你的问题可以解决了吧!

2。Decode函数也可以。
Hewwatt 2005-04-17
  • 打赏
  • 举报
回复
to s198127(xyz)
>这个方法确实能实现,但毫无可扩展性
>我这里只有4个比较字段和2个条件,这样的到还可以枚举出来
>但如过是6个比较字段,而条件要求有其中内容同时满足4个值也
>....

当数据E-R关系都没定时,千万不要期望SQL语句是万能的,可扩展的。

对于所说的如果字段增加,条件增加这种情况,我不相信能写出一行SQL语句来高效的实现之而且还能应付所需要的扩展性,因为很显然,索引的创建以及动态维护已经成为整个系统的瓶颈了,除非你只是在做'数据挖掘',并且不担心查询的效率。

说得更直接一点,当有类似这样的查询请求时,数据库的设计者更需要注重的是E-R关系的设计,而不是绞尽脑汁被动地写SQL。

要支持可扩展,唯一可行的办法是写存储过程。
tangtangno1 2005-04-17
  • 打赏
  • 举报
回复
用decode函数写的可以简洁一些
条件写成下边的样子
decode(col1,5,1,decode(col1,6,10,0))+decode(col2,5,1,decode(col2,6,10,0))+decode(col3,5,1,decode(col3,6,10,0))+decode(col4,5,1,decode(col4,6,10,0))=11
long_bow 2005-04-17
  • 打赏
  • 举报
回复
我想这样思路应该可以,你试试。
首先,select serial_no,col_A||col_B||col_C from this_table;
然后,在此结果中用字符串函数找出既有‘5’又有‘6’的serial_no
应该就是你想要的了吧。
s198127 2005-04-17
  • 打赏
  • 举报
回复
这个方法确实能实现,但毫无可扩展性

我这里只有4个比较字段和2个条件,这样的到还可以枚举出来

但如过是6个比较字段,而条件要求有其中内容同时满足4个值也

那不是要求出组合数来枚举了???

那若是更多的字段更多的条件岂不是还要先写段程序把组合列出来了再写SQL语句哦??

希望还能有更好的答案......
北极羊 2005-04-17
  • 打赏
  • 举报
回复
可以用枚举法呀,将所有的条件都列出来就行了
select * from Table where (col1=5 and (col2=6 or col3=6 or col4=6)) or (col2=5 and (col1=6 or col3=6 or col4=6)) or (col3=5 and (col1=6 or col2=6 or col4=6)) or (col4=5 and (col2=6 or col3=6 or col41=6))

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧