求助!用sql语句怎样写查询的交集?

lijingjin 2009-09-15 06:21:16
用sql语句怎样写查询的交集?
数据库中有很多组数据,但是取值范围都是在1-100,现在随机查询10组数字,每组5个数,假如我要在随机产生的每组数字中,控制它每次查询的每组结果里都必须包含有4,28,50,这样的sql语句要怎样写?下面是我写的,能查询出结果,但是结果不是我想要的那样:
sql = " select * from aa where (red1 in (" 4,28,50")) or (red2 in (" 4,28,50 ")) or (red3 in (" 4,28,50 ")) or (red4 in (" 4,28,50 ")) or (red5 in (" 4,28,50 "));
谢谢!
"4,28,50"是变量,我每次都是不同的选择,不一定就是这三个数,还有我是想要在随机抽取的red1到red5这组数字,这组数字是由5个具体数字构成,"4,28,50"这个条件是相对与这组数字来说必须要包含它们,那么其他还有两个数字就可以随便是其他的数字了,不一定要是满足这个条件的,这个条件是相对于整个数组中的5个具体数来说的,请问要怎样解决?请详细点.谢谢了!!!不胜感激!!!
...全文
182 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxmcxm 2009-09-15
  • 打赏
  • 举报
回复
-- 用于保存三个数的变量假设为@redvar
declare @redvar varchar(20)
set @redvar='4,28,50'
--red1,red2,red3,red4,red5分别与@redvar比较,看是否被包含,用一case语句来判断,是返回1非返回0 结果相加>=3即合条件

select * from aa
where case when charindex(','+red1+',',','+@redvar+',')>0 then 1 else 0 end
+case when charindex(','+red2+',',','+@redvar+',')>0 then 1 else 0 end
+case when charindex(','+red3+',',','+@redvar+',')>0 then 1 else 0 end
+case when charindex(','+red4+',',','+@redvar+',')>0 then 1 else 0 end
+case when charindex(','+red5+',',','+@redvar+',')>0 then 1 else 0 end>=3
tKF12183 2009-09-15
  • 打赏
  • 举报
回复
那你可以把5600换成一算式。。。如:
select * from aa WHERE (red1*red2*red3=4*28*50 and red1+red2+red3=4+28+50) or (red1*red2*red4=4*28*50 and red1+red2+red4=4+28+50) or (red1*red2*red5=4*28*50 and red1+red2+red5=4+28+50) or (red1*red3*red4=4*28*50 and red1+red3+red4=4+28+50) or (red1*red5*red3=4*28*50 and red1+red5+red3=4+28+50) or (red1*red4*red5=4*28*50 and red1+red4+red5=4+28+50) or (red4*red2*red3=4*28*50 and red4+red2+red3=4+28+50) or (red5*red2*red3=4*28*50 and red5+red2+red3=4+28+50) or (red4*red2*red5=4*28*50 and red4+red2+red5=4+28+50) or (red5*red4*red3=4*28*50 and red5+red4+red3=4+28+50)
devilidea 2009-09-15
  • 打赏
  • 举报
回复
lijingjin 2009-09-15
  • 打赏
  • 举报
回复
办法是可行,但是这个5600,和82是常量,而我每次的选择都是变量,这次是4,28,50,下次又不会一样,所以还是没有根本解决问题,谢谢了,还有其他的好办法吗?谢谢!
tKF12183 2009-09-15
  • 打赏
  • 举报
回复
想了一蠢办法,如要取4、28、50包含这3个数的行。。。(取其它值的话就把5600、82换掉就可以)
4*28*50=5600
4+28+50=82

select * from aa WHERE (red1*red2*red3=5600 and red1*red2*red3=82) or (red1*red2*red4=5600 and red1*red2*red4=82) or (red1*red2*red5=5600 and red1*red2*red5=82) or (red1*red3*red4=5600 and red1*red3*red4=82) or (red1*red5*red3=5600 and red1*red5*red3=82) or (red1*red4*red5=5600 and red1*red4*red5=82) or (red4*red2*red3=5600 and red4*red2*red3=82) or (red5*red2*red3=5600 and red5*red2*red3=82) or (red4*red2*red5=5600 and red4*red2*red5=82) or (red5*red4*red3=5600 and red5*red4*red3=82)
黄_瓜 2009-09-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lihan6415151528 的回复:]
感觉还是程序里面用算法实现比较方便
[/Quote]
你又整回这个图像了
lihan6415151528 2009-09-15
  • 打赏
  • 举报
回复
感觉还是程序里面用算法实现比较方便
soft_wsx 2009-09-15
  • 打赏
  • 举报
回复
加分

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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