SQL: получить список номеров, не используемых другими строками - PullRequest
2 голосов
/ 29 сентября 2010

Я использую PostgreSQL 8.1.17, и у меня есть таблица с номерами счетов. Допустимый диапазон для номера счета - это число от 1 до 1 000 000 (шестизначное число). Столбец «acctnum» содержит номер счета. Выбрать все используемые числа легко (ВЫБЕРИТЕ acctnum ОТ tbl_acct_numbers ORDER BY acctnum). Я хотел бы выбрать все числа в допустимом диапазоне, которые не используются, то есть они не найдены ни в одной строке в столбце acctnum.

Ответы [ 4 ]

4 голосов
/ 29 сентября 2010
SELECT
    new_number
FROM
    generate_series(1, 1000000) AS new_number
        LEFT JOIN tbl_acct_numbers ON new_number = acctnum
WHERE
    acctnum IS NULL;
1 голос
/ 29 сентября 2010

Вы уверены, что хотите это сделать? Я предполагаю, что причина, по которой вы хотите найти неиспользуемые номера, заключается в том, что вы можете использовать их.

Но учтите, что числа могут отсутствовать, потому что кто-то использовал их в прошлом и удалил строку из базы данных. Поэтому, если вы найдете этот номер учетной записи и повторно используете его для новой учетной записи, вы можете назначить номер, который использовался ранее и был удален по причине.

Если в других системах есть какие-либо исторические документы, которые ссылаются на этот номер счета, они могут быть ошибочно связаны с новой учетной записью с использованием того же номера.

Тем не менее, если вы учли это, вы можете найти неиспользуемые идентификаторы следующим образом:

SELECT t1.acctnum-1 AS unused_acctnum
FROM MyTable t1
LEFT OUTER JOIN MyTable t2 ON t2.acctnum = t1.acctnum-1
WHERE t2.acctnum IS NULL;

Конечно, это не находит все неиспользованные значения, только набор из них на 1 меньше, чем число, которое используется. Но этого может быть достаточно для работы.


Ответ @Alex Howansky дает вам все неиспользуемые значения, но может возвращать большой набор строк.

0 голосов
/ 29 сентября 2010

Вы можете сгенерировать последовательность чисел от 1 до 1 000 000, а затем МИНУСИТЬ результаты вашего запроса.

select * from generate_series(1,1000000)
EXCEPT
SELECT acctnum FROM tbl_acct_numbers;
0 голосов
/ 29 сентября 2010
select *
  from generate_series(1, 1000000) as acctnum
  where acctnum not in (select acctnum from tbl_acct_numbers);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...