2011-07-25 33 views
1

我列缺少ID看起来像下面如何在表中查找

SID101 
SID102 
SID103 
SID105 
SID107 

在上述标准我需要找到错过SID号。订购时错过了SID104和SID 106。

我怎样才能找到错过的id号码。任何人都可以帮我找到它。

在此先感谢。

+0

@cularis:感谢格式化:-) – Shine

+0

是否有一个表*全部* sid?还是缺少只是意味着有差距? – wonk0

+0

我会建议在代码中做这样的事情,如果它是关于找到差距。 – Jacob

回答

0

这很困难。随着

SELECT COUNT(*),MAX(CAST(REPLACE(y.name,'SID','') AS INT)) AS col_max FROM 
sys.objects x INNER JOIN sys.columns y ON x.object_id=y.object_id 
WHERE x.name='<TABLE_NAME>' 

你应该知道,有多少缺少列(即COUNT(*)是5和col_max为107)

当你有一个表,其中包含有从1到最大所有可能的ID只有一个列(即100,101,102,103,104,...,132),那么你可以做

SELECT * FROM (
    SELECT CAST(REPLACE(y.name,'SID','') AS INT) AS col_id FROM 
    sys.objects x INNER JOIN sys.columns y ON x.object_id=y.object_id 
    WHERE x.name='<TABLE_NAME>' 
) a 
RIGHT JOIN <TABLE_IDS> b ON a.col_id=b.id 
WHERE a.col_id IS NULL AND b.id<=(
    SELECT MAX(CAST(REPLACE(y.name,'SID','') AS INT)) AS col_max FROM 
    sys.objects x INNER JOIN sys.columns y ON x.object_id=y.object_id 
    WHERE x.name='<TABLE_NAME>' 
) 

编辑:对不起,我刚才看到的,这些值不列名,但值。我的解决方案会寻找失踪列名

-1
declare @t table(s varchar(20)) 

insert @t values ('SID101'),('SID102'),('SID103'),('SID105'),('SID107'); 

with cte as 
(
    select substring(t.s, 4, len(t.s)) [i] 
    from @t t 
) 

select 'SID' + cast(t1.i + 1 as varchar(20)) 
from cte t1 
join cte t2 on t2.i > t1.i 
    and not exists(
     select 1 
     from cte c3 
     where c3.i > t1.i and c3.i < t2.i 
    ) 
where t2.i <> t1.i + 1 

输出:

----------------------- 
SID104 
SID106 
+1

@downvoter中没有SID丢失的记录,请注意? –

+0

我没有downvote,但我猜测这是因为你有相同的问题的2solutions –

+0

@ t-clausen.dk,我收到downvote当我只发布第一个解决方案。这些解决方案适用于不同的情况,所以我发布了2个答案,而不是一个答案。 –

0

像这样的东西应该工作:

DECLARE @i INT; 
SET @i = 100; 

CREATE TABLE #idsToCheck (checkId varchar(100)); 

WHILE (@i < 200) 
    BEGIN 
     INSERT INTO #idsToCheck VALUES ('SID' + CONVERT(varchar(100), @i)); 
     SET @i = @i + 1; 
    END 

SELECT * FROM #idsToCheck itc 
    LEFT OUTER JOIN MainTable mt ON itc.checkId = mt.realId 
    WHERE mt.realId = NULL 

DROP TABLE #idsToCheck 

...其中MainTable是包含SID101SID102你的表,等等列值,并且MainTable.realId是包含这些ID的列。根据您想要检查的SID来修改while循环条件中的@i初始值和编号。

1

如果表中包含长度大于1项以上的差距,您可以使用此查询:

declare @t table(s varchar(20)) 

insert @t values ('SID101'),('SID102'),('SID103'),('SID105'),('SID108'); 

with cte as 
(
    select substring(t.s, 4, len(t.s)) [i] 
    from @t t 
) 
select 'SID' + cast(m.number as varchar(20)) 
from master..spt_values m 
left join cte c on c.i = m.number 
where [Type] = 'P' 
    and m.number >= (select min(i) from cte) 
    and m.number <= (select max(i) from cte) 
    and c.i is null 

输出:

----------------------- 
SID104 
SID106 
SID107 
0

声明@St INT 声明@end诠释

 set @st = CAST((select RIGHT(max(data),4) from orderno)as int) 
    set @end = CAST((select RIGHT(min(data),4) from orderno)as int) 

    create table #temp(data int) 

    while(@St <= @end) 
    begin 
insert into #temp values(@St) 
set @St = @St +1 
    end 

    select * from orderno 
    select * from #temp 
select data from #temp where data not in (select cast(RIGHT(data,4))