SQL-запрос: поиск пробела в первичном ключе - PullRequest
3 голосов
/ 06 октября 2010

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

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

Спасибо

Ответы [ 2 ]

1 голос
/ 06 октября 2010

Аналогичен ответу 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

Редактировать:

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

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

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

0 голосов
/ 06 октября 2010

Это приводит к 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
...