2010-10-06 1 views
3

Как я могу написать один оператор выбора, который делает следующее:SQL запрос: найти брешь в первичном ключе

У меня есть целочисленный столбец в моей таблице, и я хочу найти минимум доступного (не используются) значение в этом столбце, где значение ниже 1000, а также, где значение не существует в TableB cOLUMN1

Thanks

ответ

1

Подобно ответ LukeH, но это то, что вы просили:

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 

И выбрать Minumum из двух значений.

По-прежнему необходимо проверить, доступно ли значение 1, но если у вас есть промежуток между A и B, он должен найти A + 1 и B-1, и вы можете выбрать самый маленький. Очевидно, A + 1 является самым маленьким, так что вы можете просто использовать вторую часть ...

+1

Он работает немного! Это решение получит только неиспользуемое значение, которое на одно значение меньше используемого значения. Поэтому, если значение min в базе данных равно 100, ваш запрос возвращает 99. он должен вернуться 1. Есть ли способ сделать его лучше? – Bob

0

Это приводит к 7, которые я считаю, было бы правильным ответом учитывая ваши критерии

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 

 Смежные вопросы

  • Нет связанных вопросов^_^