选择表中不在特定范围内的值

时间:2011-10-04 12:46:26

标签: sql

我有一个带有id列和数十万行的表。我已经获得了1000个ID的列表来检查其他表数据。 ID不按顺序存储。 ID列表也不按顺序排列。当我使用这些ID选择表数据时,仅返回990个结果,这意味着由于该列表已生成,因此已删除/删除了10个结果。如何从该数据范围中找到10个缺失值?这就是我现在正在做的事情:

select * from mytable
where theId in (100, 2223, 31, 43321...92199, 14000)

返回990结果。我可以这样做:

select val from (1, 2, 3, 4...999, 1000) 
where val not in (
select * from mytable
where theId in (1, 2, 3, 4...999, 1000)
)
编辑:对不起,我很抱歉。我应该提到ID没有任何特定的顺序,我只是使用数字1000作为例子。它们是随机顺序,1000只是从更大的表(100,000行)中选择。

8 个答案:

答案 0 :(得分:3)

可能存在这样的情况,例如没有任何记录缺少id或者它可能有一些其他ID,例如小于1或大于1000.如果表有1000条记录,你的查询中只有990条记录,那么肯定丢失的记录的id小于1或大于1000.因此,这些丢失的记录将在以下查询中出现:

select val from mytable where 
val not in ( select distinct theId from mytable where theId in (1, 2, 3, 4...999, 1000)) 

更新:

对于随机ID,您可以这样做:

create table #temp (id int)
insert into #temp values
(501),
(1),
(21),
......
....
(4350)

SELECT t.id
FROM #temp t
LEFT OUTER JOIN mytable mt on t.id = mt.device_id
WHERE mt.id IS NULL

drop table #temp

答案 1 :(得分:1)

我会建议这样的事情:

WITH cte AS
(
SELECT 1 x
UNION ALL
SELECT x + 1
FROM cte
WHERE x < 1000
)

SELECT cte.x
FROM cte
LEFT OUTER JOIN myTable s on cte.x = s.theId
WHERE s.theId IS NULL

答案 2 :(得分:0)

您可以创建一个临时表并将1000个ID放入其中吗?然后你使用你建议的逻辑 - 有点像这样:

create table ids (id integer not null);

insert into ids values (1);
insert into ids values (2);
...
insert into ids values (1000);

select id from ids where not exists (select 1 from mytable where theID = ids.id);

drop table ids;

答案 3 :(得分:0)

你真的得到了1000条记录吗?如果它是一个范围,你可以用这个声明来试试......

WHERE theId >= 1 AND theId <= 1000

其他,您可以使用此查询排除“找到”一次...

SELECT * FROM mytable
WHERE theId NOT IN (
  select theId 
  from mytable 
  where theId is in (1, 2, 3, 4...999, 1000) 
)

答案 4 :(得分:0)

如果您想在列表中找到的ID,请:

select * from mytable
where theId not in (1, 2, 3, 4...999, 1000)

顺便说一句,如果您的(整数)ID确实从1-1000开始没有间隙,您可以使用

BETWEEN 1 AND 1000

答案 5 :(得分:0)

你可以拍摄

select val 
from my_table
order by val

如果你在oracle,你可以:

select val, lead(val) over (order by val) - val as diff_from_next
from mytable
order by val

并且下一列diff_from将与其邻居不同。

答案 6 :(得分:0)

我对以下问题给出的答案应该有所帮助 - 您使用CTE获取ID列表并将其与表中的ID进行比较:

How do I get the "Next available number" from an SQL Server? (Not an Identity column)

答案 7 :(得分:0)

为mssql 2005撰写

declare @mytabel table(id int)

-- filling @mytable with 990 values (testdata)
;with a as(
select 1 b
union all
select b + 1 from a
where b < 990
)
insert @mytabel(id)
select b from a
option (maxrecursion 0)

--find the values missing in @mytable
;with a as(
select 1 b
union all
select b + 1 from a
where b < 1000
)
select b from a 
left join @mytabel m 
on m.id = a.b
where m.id is null
option (maxrecursion 0)