AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 137512
Accepted
Muflix
Muflix
Asked: 2016-05-05 06:00:20 +0800 CST2016-05-05 06:00:20 +0800 CST 2016-05-05 06:00:20 +0800 CST

如何检查两个数字之间的范围是否在范围表中可用

  • 772

我有以下数字范围表

Create table Ranges {
  Id int identity(1,1) primary key,
  RangeFrom int not null,
  RangeTo int not null
}

Insert into Ranges(RangeFrom, RangeTo) VALUES (1,4)
Insert into Ranges(RangeFrom, RangeTo) VALUES (5,9)
Insert into Ranges(RangeFrom, RangeTo) VALUES (10,14)
-- here is free space (15 - 19)
Insert into Ranges(RangeFrom, RangeTo) VALUES (20,24)

例如,我想插入一条新记录

Insert into Ranges(RangeFrom, RangeTo) VALUES (15,19) -- Ok
Insert into Ranges(RangeFrom, RangeTo) VALUES (15,30) -- Fail

问题是,在插入之前,我需要检查插入语句中范围之间的数字是否尚未用于表中的任何其他范围。

任何想法 ?

sql-server-2008
  • 3 3 个回答
  • 9543 Views

3 个回答

  • Voted
  1. paparazzo
    2016-05-05T07:08:01+08:002016-05-05T07:08:01+08:00
    select count(*)
    from ( select RangeTo, LEAD(RangeFrom, 1, 0) OVER (ORDER BY RangeTo) 
                           AS LeadRangFrom 
           from table 
         ) ss 
    where @RangeFrom > RangeTo 
      and ( @RangeTo < LeadRangFrom or LeadRangFrom is null) 
    

    如果 count(*) 是一,那么您可以插入
    这是您要问的问题吗?

    • 3
  2. Best Answer
    Chad Mattox
    2016-05-05T06:45:58+08:002016-05-05T06:45:58+08:00

    您可以使用插入触发器根据表数据检查插入的值,如果范围已存在则失败。

    但是由于您使用的是存储过程,因此您可以签入过程。像这样的东西:

    CREATE PROCEDURE blah (@rangeFrom int, @rangeTo int)
    AS
    BEGIN
    IF EXISTS(
    SELECT 1 FROM Ranges 
    WHERE @rangeFrom BETWEEN RangeFrom AND RangeTo 
        OR @rangeTo BETWEEN RangeFrom AND RangeTo
        OR RangeTo BETWEEN @rangeTo AND @rangeFrom
        OR RangeFrom BETWEEN @rangeFrom AND @rangeTo
    )
    return
    
    INSERT INTO Ranges VALUES(@rangeFrom, @rangeTo)
    
    
    END 
    

    如果您可以确保仅通过存储过程进行插入,这将起作用。如果有人通过 t-sql 插入,只有触发器可以阻止它。

    • 0
  3. dfundako
    2016-05-05T07:32:04+08:002016-05-05T07:32:04+08:00

    正如其他人所提到的,触发器可以正常工作。您不需要更改存储过程,只需INSTEAD OF INSERT在表上放置一个触发器。

    触发器将查看插入的 RangeFrom 值是否在任何已经在相同范围内的范围之间,然后对 RangeTo 值执行相同的操作。如果它通过该逻辑,它将插入。

    如果失败,它将回滚。请注意,这仅在您像发布的那样进行单独插入时才有效。如果您希望能够插入超过 1 行数据,则需要对此进行调整。

    CREATE TRIGGER tI_Ranges ON Ranges
    INSTEAD OF INSERT 
    AS
    BEGIN 
        IF (SELECT COUNT(*) 
            FROM Ranges t 
            CROSS APPLY inserted 
            WHERE inserted.rangefrom BETWEEN t.rangefrom AND t.rangeto) = 0
              AND (SELECT COUNT(*) 
                   FROM Ranges t 
                   CROSS APPLY inserted 
                   WHERE inserted.rangeto BETWEEN t.rangefrom AND t.rangeto) = 0
        BEGIN 
            INSERT INTO Ranges(rangefrom, rangeto)
                SELECT inserted.rangefrom, inserted.rangeto
                FROM inserted
        END
        ELSE 
        BEGIN 
            ROLLBACK TRAN
        END
    END
    GO
    
    • 0

相关问题

  • 连接不同地理区域的数据库的最佳实践

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve