SELECT *
FROM info t
WHERE (SELECT COUNT(h.id)
FROM hobby h
WHERE t.id = h.info_id
AND (h.hobby = '篮球' OR h.hobby = '足球')) = 2
--当然此处存在一个求和,所以爱好个数(2)也是一个参数。
解决方案 »
- 有人在windows 7中成功的安装了Oracle的吗
- 如何在特定的条件下插入一个字段
- Oracle如何取得联合主键的组成列?
- 启动OracleOraHome90ManagementServer时出现问题:
- 数据库库创建遇到的异常
- oracle升级后日期型转换显示000000的问题
- 使用PL/SQL Developer将excel导入oracle的问题
- 求助,截取一NUMBER(10,2)类型整数部分前7位,小数点以及小数点后两位
- 请大侠帮忙看看这样的sql语句应该怎么写
- excel导入数据库,好像不简单.....
- SQL ORA-17410:无法从套接字中获取更多数据
- 怎么在数据库中查找某段时间以后的新产生的数据,而且还得有数据产生的日期啊
SELECT id,name
FROM (SELECT t.id, t.name, wm_concat(h.hobby) hobbys
FROM info t
LEFT JOIN hobby h
ON t.id = h.info_id
GROUP BY t.id, t.name)
WHERE instr(hobbys, '篮球') > 0
AND instr(hobbys, '足球') > 0--或者这个也可以,info信息表 hobby爱好表
where id in (select id from 爱好表
where hobby in ('篮球','足球')
group by id
having count(distinct hobby)=2)
不过现在令一个问题,如果我加一个条件该有如果现实:
BI(BeginIndex,从某条的index开始获取,默认获取从最新的一条开始),
PC(Count,获取多少条,默认10条)
现在就是加入两个参数,一个BI,一个PC ,先要执行上面所说的,然后再执行BI和PC 两个参数的查询条件,那该怎么改?BI和PC 是可变的
BI(BeginIndex,从某条的index开始获取,默认获取从最新的一条开始),
PC(Count,获取多少条,默认10条)
现在就是加入两个参数,一个BI,一个PC ,先要执行上面所说的,然后再执行BI和PC 两个参数的查询条件,那该怎么改?
select * from
(select 信息表.*,row_number()over (order by id) as rn from 信息表
where id in (select id from 爱好表
where hobby in ('篮球','足球')
group by id
having count(distinct hobby)=2))
where rn>=bi and rn<bi+pc
where id in (select id from 爱好表
where hobby in ('篮球')
group by id
having count(distinct hobby)=1) 那么有爱好篮球的都给查询出来了。。这个和我的需求不符合啊!
现在的需求,调整下语句就可以了
select * from 信息表
where id in (select id from 爱好表
group by id
having sum(decode(hobby,'篮球',0,'足球',0,1)=0
and count(distinct hobby)=2)
--除了这两项之外没有其他的爱好
and count(distinct hobby)=2
--并且拥有两项爱好--综合这两个条件查询出来的就是只有这两个爱好的人
这句漏写了一个右括号,见谅
having sum(decode(hobby,'篮球',0,'足球',0,1)=0 这里面sum(decode(hobby,'篮球',0,'足球',0,1)=0的数? 其实我是不明白 decode(hobby,'篮球',0,‘足球’,0,1) 这里。这个篮球,0,足球0,1
and count(distinct hobby)=2 这个等于 1 或者3 ?
哈哈,那个括号的问题我可以解决的,这个没事。
那么我不但需要根据value的值还需要根据key 的值来判断。 是不是这个样子 select * from 信息表
where id in (select id from 爱好表
group by id
having sum(decode(key,'L',0,'Z',0,1))=0
and sum(decode(value,'篮球',0,'足球',0,1))=0
and count(distinct key)=2) and count(distinct value)=2)
decode(hobby,'篮球',0,'足球',0,1)
decode(hobby,'篮球',0,'篮球',0,'游泳',0,1)多一个就并在里面就可以了,没啥区别
这个在我的需求中是要的,因为我的表中key对应多个value,在上面那个表中,key 的L 对应篮球,但是也可能不是篮球。这个懂了吧。key 对应的value值是不确定的。所以那个key和value 都要判断的。你看看我上面写的对不对!
假设L既对应篮球也对应足球
那么既喜欢篮球也喜欢足球的人,取出的count(distinct key)取值为1,这样结果就不对了
需要具体问题具体分析了