1

MINIMUM_AMOUNT、MAXIMUM_AMOUNT、および CURRENCY_ID を格納する SQL サーバーにテーブルがあります。ここで、挿入する新しい値がテーブルに既に存在することを確認する SQL クエリを組み立てたいと思います。例: 私のテーブルには次のように 2 つのレコードがあります

RANGE_ID   MINIMUM_AMOUNT     MAXIMUM_AMOUNT    CURRENCY_ID
------------------------------------------------------------
 1         3000                 9000                3
 2         12000                17000               3

ユーザーが新しいレコードを挿入するとき、すでに使用可能な値の間にあるべきではありません

つまり、ユーザーはこれらの値のペアを入力できないはずです

  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 クエリを探しています。

4

3 に答える 3

2

これを見てください

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)  

チェックの逆です

  • フルオーバーラップ
  • 部分重複
  • 内部重複
于 2009-12-11T06:36:02.790 に答える
0

これでうまくいくと思います:

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条件を反転するために使用します。

于 2009-12-11T06:37:42.273 に答える