-1

from我在一个包含两列的表中有一个数据to,例如:5-9.

如果我插入一个新行1-6,它不应该被接受,因为6它位于 和5之间9

1-3- 应该接受(没有重叠),10-13- 也应该接受。

我需要一个查询

4

3 回答 3

0

尝试这个

DECLARE @from INT
DECLARE @to INT

SET @from = 14
SET @to = 16

IF NOT EXISTS (SELECT 1 FROM Table1 WHERE @from BETWEEN [from] AND [to]
                                OR @to BETWEEN [from] AND [to]
                                OR @from <= [from] AND @to >= [to])
BEGIN
  INSERT INTO Table1([from], [to]) VALUES(@from, @to)
END
ELSE
BEGIN
  --Already Exists
END
于 2013-03-19T05:51:30.770 回答
0

尝试这个:


if not exist (select * from table where @from between [from] and [to])
begin 
  if not exist (select * from table where @to between [from] and [to])
    begin 
    if not exist(select * from table where [from] between @from and @to)
       begin 
          insert into table 
                select @from, @to
       end
    end
end

于 2013-03-19T05:18:41.040 回答
0

根据 SQL 供应商的不同,实现会有所不同,但想法是相同的:您需要创建一个TRIGGERonINSERTUPDATE.

这是 PostgreSQL 的解决方案:

CREATE TABLE mytable (
    id SERIAL, 
    m1 INTEGER, 
    m2 INTEGER
);

CREATE OR REPLACE FUNCTION mytable_fn()
RETURNS trigger AS
$body$
DECLARE cnt INTEGER;
BEGIN
    SELECT count(*) INTO cnt
    FROM mytable
    WHERE numrange(NEW.m1, NEW.m2)
       && numrange(    m1,     m2);
    IF cnt > 0 THEN RAISE EXCEPTION 'Constraint violation';
               ELSE RETURN NEW;
    END IF;
END;
$body$
LANGUAGE 'plpgsql';

CREATE TRIGGER mytable_tr
BEFORE INSERT OR UPDATE 
ON mytable FOR EACH ROW 
EXECUTE PROCEDURE mytable_fn();
于 2013-03-19T05:24:36.600 回答