Как найти пропущенный идентификатор в таблице - PullRequest
1 голос
/ 25 июля 2011

У меня есть столбец, как показано ниже

SID101
SID102
SID103
SID105
SID107

В приведенных выше критериях мне нужно найти пропущенные номера SID.SID104 и SID 106 пропускаются при заказе.

Как я могу найти пропущенные идентификаторы. Может ли кто-нибудь помочь мне найти его.

Заранее спасибо.

Ответы [ 5 ]

1 голос
/ 25 июля 2011

Если ваша таблица содержит пробелы длиной более 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 голосов
/ 26 июля 2011

 Объявить @St int объявить @end int

     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))
0 голосов
/ 25 июля 2011
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
0 голосов
/ 25 июля 2011

Примерно так должно работать:

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 - ваша таблица, содержащая значения столбцов SID101, SID102 и т. Д., А MainTable.realId - столбецсодержащие эти идентификаторы.Измените начальное значение @i и число в условии цикла while, основываясь на том, какие SID вы хотите проверить от / до.

0 голосов
/ 25 июля 2011

Это сложно. С

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 до макс. (Т. Е. 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>'
)

РЕДАКТИРОВАТЬ : извините, я только что видел, что эти значения не имена столбцов, а значения. Мое решение найдет отсутствующие имена столбцов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...