SQL:获取其他行未使用的数字列表

时间:2010-09-29 16:51:08

标签: sql postgresql

我正在使用PostgreSQL 8.1.17,我有一个包含帐号的表。帐号的可接受范围是1到1,000,000之间的数字(六位数字)。 “acctnum”列包含帐号。选择正在使用的所有数字很容易(SELECT acctnum FROM tbl_acct_numbers ORDER BY acctnum)。我想要做的是选择可接受范围内未使用的所有数字,也就是说,在列acctnum中的任何行中找不到它们。

4 个答案:

答案 0 :(得分:4)

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 :(得分:1)

你确定要这么做吗?我假设你想找到未使用的数字的原因是你可以使用它们。

但请考虑这些数字可能不存在,因为某人过去曾使用它们,并从数据库中删除了该行。因此,如果您找到该帐号并将其重新用于新帐户,则可以指定以前使用过的号码,并将其删除。

如果其他系统中有任何引用该帐号的历史文档,则可能会错误地使用相同的号码将其与新帐户相关联。

但是,只要您考虑过这一点,就可以通过以下方式找到未使用的ID:

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;

当然,这并没有找到 all 未使用的acctnums,只有一组比正在使用的数字少1。但这可能会让你有足够的合作。


来自@Alex Howansky的答案会给你所有未使用过的acctnums,但它可能会返回一大堆行。

答案 2 :(得分:0)

select *
  from generate_series(1, 1000000) as acctnum
  where acctnum not in (select acctnum from tbl_acct_numbers);

答案 3 :(得分:0)

您可以生成1-1,000,000的一系列数字,然后减去查询结果。

select * from generate_series(1,1000000)
EXCEPT
SELECT acctnum FROM tbl_acct_numbers;