صعبة إذا موجودة استعلام SQL اللازمة للتحقق من القيم المتداخلة

StackOverflow https://stackoverflow.com/questions/1886171

  •  19-09-2019
  •  | 
  •  

سؤال

أواجه طاولة في SQL Server والتي تخزنها حد أدنى، ويمكن أن يكون الحد الأقصى لعدد العملة. الآن أريد أن أؤكد استعلام 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

يجب أن يكون المستخدم قادرا على إدخال النطاق أعلاه مع معرف العملات المختلفة.

أنا أبحث عن a موجود الاستعلام للتحقق من ذلك.

هل كانت مفيدة؟

المحلول

الق نظرة على هذا

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)  

هذا هو عكس التدقيق

  • التداخل الكامل
  • تداخل جزئي
  • التداخل الداخلي

نصائح أخرى

أعتقد أن هذا سوف يفعل ذلك:

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 لمنعقل الشرط.

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)
)

يمكن استخدام هذا كصريحة موجودة للتحقق من التداخل في النطاقات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top