有如下一种需求,这种需求很常见。
如一个班级(a)里有许多学生(b),现在的需求是 查询出 即有名叫张三,又有名叫李四(条件数不定,可能更多名字)的班级。伪代码,就类似于
select a.id from a where (:名字列表) in a.bList.name
就是在a的学生里,即有名字一,又有名字二,又有名字三...这种需求,使用oracle如何实现,如果是其它数据库呢。
谢谢:)

解决方案 »

  1.   

    (:名字列表)即指参数列表,
    比如
    select a.id from a where (张三,李四,王五) in a.bList.name存储名字的列,在表b的name列上。
      

  2.   


    子查询??如果是 类似
    select a.id from a inner join a.bList b where b.name in (张三,李四,王五) 这种查询,
    我就不会来这里发问了。
      

  3.   

    实测数据: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', '王五');
    实测结果:
      

  4.   

    LuiseRADL
    这个的可以用,不过我看到 vm_concat 和 like ,以及%张三%李四 这个效率......并且,%张三%李四 还需要通过字符串拼接预告拼接在一块......
      

  5.   

    --借用下表结构 :)
    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'中姓名的个数。
      

  6.   

    a,b如何转换成'a', 'b',
    以及动态sql的知识如果不知道的话再google下
      

  7.   

    我参考这个帖子
    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)
    这种方式结果可以出来