Si existe complicado consulta SQL necesaria para comprobar los valores superpuestos
Pregunta
Estoy teniendo una tabla en SQL Server que almacena MINIMUM_AMOUNT, MAXIMUM_AMOUNT y CURRENCY_ID. Ahora quiero enmarcar una consulta SQL que comprobará los nuevos valores que deben insertarse ya existente en la tabla. Ej: Mi mesa está teniendo 2 registros de la siguiente manera
RANGE_ID MINIMUM_AMOUNT MAXIMUM_AMOUNT CURRENCY_ID
------------------------------------------------------------
1 3000 9000 3
2 12000 17000 3
Ahora, cuando el usuario inserta un registro nuevo, no debería estar entre los valores ya disponible
es decir: El usuario no debe ser capaz de entrar en estos pares de valores
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
El usuario debe ser capaz de entrar en el intervalo anterior con diferentes identificadores de moneda.
Busco a una consulta si existe para comprobar esto.
Solución
Tener un vistazo a este
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)
Este es el reverso de la comprobación
- solapamiento completo
- superposición parcial
- La superposición interna
Otros consejos
Creo que esto lo hará:
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;
Uso IF NOT EXISTS
para invertir la situación.
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)
)
Esto puede ser usado como un EXISTS declaración para comprobar si hay solapamientos en los rangos