SQL排除查询

时间:2011-07-27 18:30:03

标签: sql oracle10g

是否可以在单个SQL语句中执行以下操作:

在提示中使用电话号码的子集,例如8001231000-8001239999。然后查询我的数据库中有电话号码,并返回原始子集中的哪些电话号码不在我的数据库中?我的数据库是Oracle 10g。

基本上我没有找回8001231000-8001239999之间的电话号码,而是想知道8001231000-8001239999之间哪些电话号码不在我的数据库中。

6 个答案:

答案 0 :(得分:4)

假设电话号码是NUMBER,您可以生成特定范围内所有电话号码的列表

 SELECT level - 1 + 8001231000
   FROM dual
CONNECT BY level <= 8001239999-8001231000+1

然后,您可以将此范围内所有电话号码的列表加入到您的实际电话号码表中。像

这样的东西
WITH all_numbers AS (
  SELECT level - 1 + 8001231000 phone_number
    FROM dual
 CONNECT BY level <= 8001239999-8001231000+1
)
SELECT *
  FROM all_numbers a
 WHERE NOT EXISTS(
    SELECT 1
      FROM phone_numbers p
     WHERE a.phone_number = p.phone_number)

答案 1 :(得分:2)

如果您的电话号码是字符:

select * from mytable
where phone_number not between '8001231000' and '8001239999'

或如果它们是数字:

select * from mytable
where phone_number not between 8001231000 and 8001239999

答案 2 :(得分:2)

我会加载一个临时表,其中包含您要检查的范围内的所有10000个电话号码,并执行排除加入:

SELECT a.phone_number
FROM phone_numbers_i_want_to_check AS a
LEFT OUTER JOIN phone_numbers AS b
  ON a.phone_number = b.phone_number
WHERE b.phone_number IS NULL;

答案 3 :(得分:0)

您正在寻找带有与这些电话号码匹配的子查询的“NOT IN”运算符。

答案 4 :(得分:0)

我想不出单一选择的方法,但你可以用一个事务来做。具体做法是:

  • 使用您的范围内的值创建临时表(应该可以使用单个创建表和一个插入)
  • 从临时表中删除主表中存在的值
  • 从临时表中选择剩余的值

编辑: Bill Karwin的answer更好。与临时表相同的概念,但随后只有一个选择来提取不存在的值。

答案 5 :(得分:0)

这样的事情:

SELECT numbers_array.num
  FROM (SELECT 8001231000 + LEVEL num 
          FROM dual 
       CONNECT BY LEVEL <= (8001239999 - 8001231000)
       ) numbers_array
 WHERE numbers_array.num NOT IN (SELECT number_you_have FROM your_table_of_numbers)

创建所有可能数字的伪列表,并从中排除现有数字。