假如我有一张表 表名为 u 此表中有以下字段 id(自增长),wid(告警ID),Uid(用户ID),dt(开始时间),enddt(结束时间)  wid,uid都是整型的,存在另外一张表,现在用户uid=(277,278,288,299...n),wid=(1,2,3,4,5....n)[这个长度是有限的]
  现在有这样的需求   用过用户ID,告警ID,开始时间与结束时间查询出数据来,告警ID的条件不是wid in (1,2,3,4,5,....n) 而是说某个用户他的即包含wid=1又要包含wid=2的才允许查出来信息,应该怎么样写查询语句?

解决方案 »

  1.   

    id     uid  wid    dt      enddt
    1       288  3     12-10-11   12-10-11
    2       288  4     12-10-11   12-10-11
    3       288  3     12-10-11   12-10-11
    4       288  2     12-10-11   12-10-11
    条件是查询用户ID为288 告警号为3和4都存在的记录   如果用户输入的是wid为3,4,5这样的条件,则不显示记录,意思就是说wid的条件是每个都存在时候才显示 
      

  2.   

    朋友久等了,上午太忙了。看看对不对。
    WITH table1 AS
    (
         SELECT '1' AS id, '288' AS aa,'3' AS wid,'12-10-11' AS dt,'12-10-11' AS enddt FROM dual
         union all
         SELECT '2' AS id, '288' AS aa,'4' AS wid,'12-10-11' AS xm,'12-10-11' AS enddt FROM dual
         union all
         SELECT '3' AS id, '288' AS aa,'3' AS wid,'12-10-11' AS xm,'12-10-11' AS enddt FROM dual
         union all
         SELECT '4' AS id, '288' AS aa,'2' AS wid,'12-10-11' AS xm,'12-10-11' AS enddt FROM dual
         union all
         SELECT '5' AS id, '299' AS aa,'5' AS wid,'12-10-11' AS xm,'12-10-11' AS enddt FROM dual  
    )
    select* from table1 
    where 0 = (
    select regexp_instr(translate(replace('3,4,2,2,2,3,4'/*<-用户输入的东西*/, ',' ), str, 'XXXXXXXX'),
                                  '\d') AS STR3 FROM (select listagg(wid) within
                          group(
                          order by wid) as str
                           from table1
                          where aa = '288')) and aa = '288'
      

  3.   

    select a.uid
    from
    (select uid from u where wid=3) a,
    (select uid fron u where wid=4) b
    where a.uid=b.uid
      

  4.   

    用这个函数吧:wmsys.wm_concat(将查询出来的列用','连接起来组成的字符串)。select * from table where (select * from (select wmsys.wm_concat(t.w) w1 from (select wid w from table order by wid) t)) t1 where t1.w1 = '用户输入排序后的字符串') like '%||wid||%'
      

  5.   

    输入格式: 用户1 =288 ,警告号='3,4,5'with tmp_table as
    (select wid from u t2 where t2.uid = 用户1)select * from u t1
    where t1.uid = 用户1
    and not exists (  
                      select 1 from 
                      (
                          select regexp_substr(警告号,'[^,]+',1,level)  wid from dual connect by level<=
                            (select length(警告号)-length(replace(警告号,',')) from dual)+1 
                       ) t4  
                      where  not exists ( select 1 from tmp_table t5 where t5.wid=t4.wid )
                    );