各位大侠:现阶段小弟有个项目需求,就是有一张表大概是这样子的,如下
zone      min      max
A区域     1         10B区域     12        50C区域     80        100
大概是这样子的,小弟我现在想通过sql判断我新增一条记录D 那么D 的记录不能在已有区域记录中出现 也就是说D区域的min到max的中包含的值不能再其他区域中出现.小弟的意思是说是从sql层面能不能处理完成呢?望各位交流指教,不想拿到java中一个一个的比较.  

解决方案 »

  1.   

    你可以用触发器监视insert操作,若新增的记录与已有的每条记录都不抵触,则进行插入,否则不予插入动作做提交(也就是取消该条记录插入)。
    SQL语句不是很难,顶多也就是表连接之类的东东,主要是触发器语法,各种数据库上并不一样...
      

  2.   

    可以啊,也就是D的min和max都不会被任何一个区域所包含咯:Select zone, min, max
    From 表
    Where (max < #Dmin Or min > #Dmin) And (max < #Dmin Or min > #Dmin)如果返回了记录,说明与该区域有交叉,没返回则说明OK。
      

  3.   

    上面那啥写错了,刚好把效果写反了,汗,应该是:
    Select zone, min, max
    From 表
    Where (max >= #Dmin And min <= #Dmin) Or (max >= #Dmax Or min <= #Dmax)
    返回的记录是存在交叉的区域。
      

  4.   

    顺便合并成一句Insert的话:Insert Into 表(zone, min, max)
    Select #Dzone, #Dmin, #Dmax
    Where Not Exist (
      Select zone  From 表
      Where (max >= #Dmin And min <= #Dmin) Or (max >= #Dmax Or min <= #Dmax)
    )如果插入了记录,就是符合条件;没插入任何记录,就是不符合条件。
      

  5.   

    每条记录的问题:
    ①用SQL做,SQL的全称量词是exists和not exists
    或者
    ②用游标做,和Java程序中的逻辑差不多了,要遍历表中原来的所有记录
      

  6.   


    为啥不行?有无错误信息?(magong说的是对了,前面打错了,应该是 Not Exists)另:不是我换工作,是kouyiSC
      

  7.   

    这样吧,我刚为你做了一个MS SQL Server的触发器的例子,你借鉴一下:--基础表
    create table zones(
      zone varchar(10) primary key,
      minv int not null,
      maxv int not null
    )--插入初始数据
    insert into zones values('A区域', 1, 10)
    insert into zones values('B区域', 12, 50)
    insert into zones values('C区域', 80, 100)select * from zones
    --3条--创建触发器
    create
    alter trigger zones_insert
    on zones
    after insert
    as
    if exists 
    (select * from zones, inserted
       where (inserted.minv <= zones.maxv
             and 
             inserted.minv >= zones.minv
             or
             inserted.maxv <= zones.maxv
             and
             inserted.maxv >= zones.minv)
             and
             inserted.zone != zones.zone
    )
    rollback     --做完触发器后测试
    insert into zones values('D区域', 88, 100)
    select * from zones
    --3条
    insert into zones values('D区域', 78, 80)
    select * from zones
    --3条
    insert into zones values('D区域', 120, 130)
    select * from zones
    --4条
    --测试表明触发器行为合格
      

  8.   

    嗯。
    我说的是我的想法,你没必要一下子考虑得那么周全。如果想简单一点,
    你可以先写一个SQL,查询有冲突的记录的条数,如:
    select count(*) from zones where 数据1 between min and max
      or 数据2 between min and max
    如果返回的是0,则说明当前数据合法,就可以执行insert语句了。