2010-10-06 6 views
3

Comment puis-je écrire une seule instruction select qui effectue les opérations suivantes:requête SQL: trouver une lacune dans une clé primaire

J'ai une colonne entière dans ma table et je veux trouver le minimum disponible (non utilisé) valeur dans cette colonne où la valeur est inférieure à 1000 et également lorsque la valeur n'existe pas dans TableB Column1

Merci

Répondre

1

similaires à la réponse de LukeH, mais il fait ce que vous avez demandé:

SELECT MIN(a.your_column) - 1 AS answer 
FROM your_table AS a 
LEFT JOIN your_table AS a2 
     ON a2.your_column = a.your_column - 1 
LEFT JOIN tableB AS b 
     ON a.your_column = b.column1 
WHERE a.your_column < 1000 
    AND b.column1 IS NULL 
    AND a2.your_column IS NULL 

Edit:

UNION 
SELECT MIN(a.your_column) + 1 AS answer 
FROM your_table AS a 
LEFT JOIN your_table AS a2 
     ON a2.your_column = a.your_column + 1 
LEFT JOIN tableB AS b 
     ON a.your_column = b.column1 
WHERE a.your_column < 1000 
    AND b.column1 IS NULL 
    AND a2.your_column IS NULL 

et choisissez minumum des deux valeurs.

Il faut encore vérifier si la valeur 1 est disponible, mais si vous avez un écart entre A et B, vous devriez trouver A + 1 et B-1 maintenant et vous pourriez choisir le plus petit. Il est évident que A + 1 est le plus petit de sorte que vous pouvez simplement utiliser la deuxième partie ...

+1

Il fonctionne un peu! Cette solution obtiendra seulement une valeur non utilisée qui est une valeur moins qu'une valeur utilisée. Donc, si la valeur min dans la base de données est 100, votre requête renvoie 99 .. elle devrait renvoyer 1. Y at-il un moyen de l'améliorer? – Bob

0

Il en résulte 7, que je crois serait la bonne réponse donnée à vos critères

CREATE TABLE #TableA (Value INT) 
INSERT #TableA (Value) VALUES (1) 
INSERT #TableA (Value) VALUES (2) 
INSERT #TableA (Value) VALUES (3) 
INSERT #TableA (Value) VALUES (5) 
INSERT #TableA (Value) VALUES (6) 
INSERT #TableA (Value) VALUES (8) 

CREATE TABLE #TableB (Value INT) 
INSERT #TableB (Value) VALUES (4) 

SELECT MIN(A1.Value) + 1 
FROM  #TableA A1 
LEFT JOIN #TableA A2 ON A2.Value = A1.Value + 1 
LEFT JOIN #TableB B1 ON B1.Value = A1.Value + 1 
WHERE  A2.Value IS NULL 
AND  B1.Value IS NULL 
AND  A1.Value < 1000 

DROP TABLE #TableA 
DROP TABLE #TableB 
Questions connexes