صعبة إذا موجودة استعلام SQL اللازمة للتحقق من القيم المتداخلة
سؤال
أواجه طاولة في 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)
)
يمكن استخدام هذا كصريحة موجودة للتحقق من التداخل في النطاقات
لا تنتمي إلى StackOverflow