oralce中实现类似many in many的语句

Fly_m 2012-02-02 11:21:03
有如下一种需求,这种需求很常见。
如一个班级(a)里有许多学生(b),现在的需求是 查询出 即有名叫张三,又有名叫李四(条件数不定,可能更多名字)的班级。

伪代码,就类似于
select a.id from a where (:名字列表) in a.bList.name
就是在a的学生里,即有名字一,又有名字二,又有名字三...

这种需求,使用oracle如何实现,如果是其它数据库呢。
谢谢:)
...全文
159 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
我心飞翔 2012-02-02
  • 打赏
  • 举报
回复
还有一种,至于哪种效率高,得查看具体的执行计划。
我心飞翔 2012-02-02
  • 打赏
  • 举报
回复
换一下,估计效率也不能太高。(因为你可能有多个条件)
minitoy 2012-02-02
  • 打赏
  • 举报
回复
a,b如何转换成'a', 'b',
以及动态sql的知识如果不知道的话再google下
minitoy 2012-02-02
  • 打赏
  • 举报
回复
--借用下表结构 :)
CREATE TABLE Student
(
ID VARCHAR2(20),
ClassID VARCHAR2(20),
NAME VARCHAR2(20)
);

-- 1年1班
INSERT INTO Student VALUES('010101', '0101', 'a');
INSERT INTO Student VALUES('010102', '0101', 'b');
-- 1年2班
INSERT INTO Student VALUES('010201', '0102', 'a');
INSERT INTO Student VALUES('010202', '0102', 'c');

select t.classid
from Student t
where t.name in ('a', 'b')
group by t.classid
having count(distinct t.name) = 2

像这种情况一般是在过程中使用。所以传入的'a', 'b'应该是个字符窜'a,b'
通过length(窜'a,b') - length(replace(窜'a,b', ',', '')) + 1
可以计算出窜'a,b'中姓名的个数。
Fly_m 2012-02-02
  • 打赏
  • 举报
回复
LuiseRADL
这个的可以用,不过我看到 vm_concat 和 like ,以及%张三%李四 这个效率......

并且,%张三%李四 还需要通过字符串拼接预告拼接在一块......
我心飞翔 2012-02-02
  • 打赏
  • 举报
回复
实测数据:

CREATE TABLE Classes
(
ID VARCHAR2(20),
NAME VARCHAR2(20)
);

INSERT INTO Classes VALUES('0101', '1年1班');
INSERT INTO Classes VALUES('0102', '1年2班');
INSERT INTO Classes VALUES('0201', '2年1班');
INSERT INTO Classes VALUES('0202', '2年2班');

CREATE TABLE Student
(
ID VARCHAR2(20),
ClassID VARCHAR2(20),
NAME VARCHAR2(20)
);

-- 1年1班
INSERT INTO Student VALUES('010101', '0101', '张三');
INSERT INTO Student VALUES('010102', '0101', '李四');
-- 1年2班
INSERT INTO Student VALUES('010201', '0102', '张三');
INSERT INTO Student VALUES('010202', '0102', '王五');


实测结果:
Fly_m 2012-02-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yinan9 的回复:]
子查询可以解决吧
[/Quote]

子查询??如果是 类似
select a.id from a inner join a.bList b where b.name in (张三,李四,王五) 这种查询,
我就不会来这里发问了。
yinan9 2012-02-02
  • 打赏
  • 举报
回复
子查询可以解决吧
Fly_m 2012-02-02
  • 打赏
  • 举报
回复
(:名字列表)即指参数列表,
比如
select a.id from a where (张三,李四,王五) in a.bList.name

存储名字的列,在表b的name列上。
yixilan 2012-02-02
  • 打赏
  • 举报
回复
你这个(:名字列表)是啥?
是存储名字的列的列名么?还是?
minitoy 2012-02-02
  • 打赏
  • 举报
回复
这个办法好,不过有风险哦
比如一个要匹配张三丰,张三也会被匹配命中。
建议使用',张三,'去匹配',张三,李四,王五,'
[Quote=引用 11 楼 fly_m 的回复:]

我参考这个帖子
http://www.itpub.net/thread-1169213-3-1.html
弄出这种查询方式
select a.id from a inner join b on b.aId = a group by a.id having count(case when b.name in (张三,李四,王五...)then 1 end) = 3(参数长度)

测试语句……
[/Quote]
Fly_m 2012-02-02
  • 打赏
  • 举报
回复
我参考这个帖子
http://www.itpub.net/thread-1169213-3-1.html
弄出这种查询方式
select a.id from a inner join b on b.aId = a group by a.id having count(case when b.name in (张三,李四,王五...)then 1 end) = 3(参数长度)

测试语句

select name from classes where id in (select a.id from Classes a inner join Student b on b.classid = a.id group by a.id having count(case when b.name in('张三','李四') then 1 end) = 2)


这种方式结果可以出来

3,494

社区成员

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

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