首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果存在需要检查重叠值的SQL查询,则需要使用技巧

如果存在需要检查重叠值的SQL查询,则需要使用技巧
EN

Stack Overflow用户
提问于 2009-12-11 14:23:23
回答 3查看 911关注 0票数 1

我在SQL server中有一个表,其中存储了MINIMUM_AMOUNT、MAXIMUM_AMOUNT和CURRENCY_ID。现在我想构造一个SQL查询,它将检查要插入的新值是否已经存在于表中。例如:我的表有2条记录,如下所示

代码语言:javascript
复制
RANGE_ID   MINIMUM_AMOUNT     MAXIMUM_AMOUNT    CURRENCY_ID
------------------------------------------------------------
 1         3000                 9000                3
 2         12000                17000               3

现在,当用户插入新记录时,它不应该在已有的值之间

即:用户不应该能够输入这些值对

代码语言:javascript
复制
  1 ) Min Amount : 4000  , Max Amount : 5000 ,Currency Id : 3
        because this range already lies in the first record (RANGE_ID 1)
  2)  Min Amount : 8000 , Max Amount : 10000,Currency d : 3
        because the minimum amount is already present in the range specified in first record (3000-9000)
  3)   Min Amount : 8000, Max Amount : 15000 , currency Id=3
       because the minimum amount is already present in one range and the maximum amount is also present in another range
  4)   Min Amount : 2500 , Max Amount : 11000 ,Currency Id=3
        because the this range overlaps with the data in first record

用户应该能够输入不同的货币ID的上述范围。

我正在寻找If Exists查询来检查这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-11 14:36:03

看看这个

代码语言:javascript
复制
DECLARE @Table TABLE(
        RANGE_ID INT,
        MINIMUM_AMOUNT FLOAT,
        MAXIMUM_AMOUNT FLOAT,
        CURRENCY_ID INT
)

INSERT INTO @Table (RANGE_ID,MINIMUM_AMOUNT,MAXIMUM_AMOUNT,CURRENCY_ID) SELECT 1,3000,9000,3
INSERT INTO @Table (RANGE_ID,MINIMUM_AMOUNT,MAXIMUM_AMOUNT,CURRENCY_ID) SELECT 2,12000,17000,3

DECLARE @NewMin FLOAT,
        @NewMax FLOAT,
        @CurrencyID INT

SELECT  @NewMin = 4000,
        @NewMax = 5000,
        @CurrencyID = 3

SELECT  *
FROM    @Table
WHERE   CURRENCY_ID = @CurrencyID
AND     NOT (MINIMUM_AMOUNT > @NewMax OR MAXIMUM_AMOUNT < @NewMin)  

这是检查的相反情况

  • Full overlap
  • Partial
  • Overlap
  • Partial

  • Overlap

  • Partial Partial Overlap
票数 2
EN

Stack Overflow用户

发布于 2009-12-11 14:37:42

我想这样就可以了:

代码语言:javascript
复制
IF EXISTS
(
    SELECT *
    FROM MinMaxTable mmt
    WHERE (mmt.CURRENCY_ID = @currencyID) AND
          (@minAmount BETWEEN mmt.MINIMUM_AMOUNT AND mmt.MAXIMUM_AMOUNT) AND
          (@maxAmount BETWEEN mmt.MINIMUM_AMOUNT AND mmt.MAXIMUM_AMOUNT)
)
BEGIN
    /* New data is within an existing range. */
END
ELSE
BEGIN
    /* Partially or completely outside an existing range. */
END;

使用IF NOT EXISTS反转条件。

票数 0
EN

Stack Overflow用户

发布于 2009-12-11 15:44:20

代码语言:javascript
复制
select 1 
from currency_ranges R
where R.CURRENCY_ID = :newCurrency
and (
(R.MINIMUM_AMOUNT <= :newMin and R.MAXIMUM_AMOUNT >= :newMin)
or (R.MINIMUM_AMOUNT <= :newMax and R.MAXIMUM_AMOUNT >= :newMax)
)

这可用作EXISTS语句,以检查范围中是否存在重叠

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1886171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档