表结构如下:
ID 表:
SCOPE_ID NUMBER  pk AUTO ID
START_ID NUMBER  ID范围的开始值
END_ID NUMBER  ID范围的结束值
START_DATE TIMESTAMP
END_DATE TIMESTAMP
 现在我有一组查询数据,start_id,end_id,start_date,end_date.
 现在我要查询所有与, 集合一和集合二的交际不为空的记录,语句该怎么写。
比如说start_id=1,end_id=10,start_date=2011-09-01,end_date=2011-09-10.
 那么,集合一就是 从1到10的范围内的整数组成的数据
集合二就是从2011-09-01到2011-09-10 的日期组成的集合。目的就是查出ID.START_ID,ID.END_ID 组成的集合与start_id 和end_id组成的集合交集不为空
并且ID.START_DATE,ID.END_DATE与 组成的集合与start_date 和end_date组成的集合交集不为空
 
不知道语句怎麽写呀,我的这个集合都是两端包含的。

解决方案 »

  1.   

    ( START_ID  >= 1 and END_ID <= 10 )
      and 
      ( START_DATE >= 2011-09-01 and END_DATE <= 2011-09-10 )=> ( START_ID  >= start_id and END_ID <= end_id )
      and 
      ( START_DATE >= start_date and END_DATE <= end_date )
      

  2.   

    以下是3种情况,加上date的条件估计更多。不知道是不是我想复杂了:IF A.START_ID <= B.START_ID AND A.END_ID >= B.START_ID THEN
    集合为 B.START_ID~A.END_ID or B.START_ID~B.END_IDIF A.START_ID >= B.START_ID AND A.END_ID <= B.END_ID THEN
    集合为 A.START_ID~A.END_ID
      

  3.   

    第二个比较接近要求,只是只有Id 约束的情况下的 情况还没有考虑完全。再说明下要求:目的就是查出ID.START_ID,ID.END_ID 组成的集合与start_id 和end_id组成的集合交集不为空
    并且ID.START_DATE,ID.END_DATE与 组成的集合与start_date 和end_date组成的集合交集不为空
    的 记录因为是组合条件,只要两个求交集都不为空 的记录就符合要求。
    查询时给出的条件是下面的4个值。
    start_id,end_id,start_date,end_date.
    当然可以分步考虑先求与start_id到end_id组成的集合不为空的再and DATE的。如果用单纯用if判断,我这两个条件要写很多语句,工作量大,还不利用以后维护呀,可读性太差。
    不知道能不能以集合的形式去查询,好读呀。如果我随便给两个数,比如说 3,8然后数据库能组成集合 3..8就好啦,这样直接用Intersection ,可是我又不想用Pl/sql, 用的是sql+java写的,易于维护