2009-12-11 4 views
1

Je chevauchent ai une table dans SQL Server qui stocke MINIMUM_AMOUNT, MAXIMUM_AMOUNT et CURRENCY_ID. Maintenant, je veux encadrer une requête SQL qui va vérifier les nouvelles valeurs à insérer sont déjà présents dans la table. Ex: Ma table est d'avoir 2 dossiers comme suitTricky Si requête SQL Exists nécessaire pour vérifier les valeurs

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

Maintenant, lorsque l'utilisateur insère un nouvel enregistrement, il ne devrait pas être entre les valeurs déjà disponibles

à savoir: L'utilisateur ne doit pas être en mesure d'entrer dans ces paires de valeurs

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 

L'utilisateur doit pouvoir entrer la plage ci-dessus avec différents identifiants de devise.

Je suis à la recherche d'une requête If Exists pour vérifier cela.

Répondre

2

Jetez un oeil à ce

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) 

Ceci est l'inverse de la vérification

  • chevauchement complet
  • Overlap partielle
  • interne Overlap
0

Je pense que cela faites-le:

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; 

Utilisez IF NOT EXISTS pour inverser la condition.

+0

Cela ne gère pas le chevauchement – Shyju

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

Cela peut être utilisé comme une déclaration EXISTE pour vérifier les chevauchements dans les gammes

Questions connexes