我有一个带有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行)中选择。
答案 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)