Найти недостающий ключ ID или номера из значений столбца - PullRequest
0 голосов
/ 04 апреля 2019

Нужно найти пропущенные числа, которые были удалены или столбца еще нет.

Например:

У меня есть таблица Именованный человек имеет столбцы [PersonID] [PersonName]

[PersonID] является основным и инкрементным числом, например, от 1 до N.

PersonID            PersonName
1001                       ABC
1002                       ABC
1003                       XYZ
1004                       MNO
1006                       ABC
1008                       MNO
1009                       ABC
1010                       ABC
1011                       XYZ
1014                       ABC
1015                       ABC
1016                       XYZ
1017                       MNO

В данной таблице есть некоторые пропущенные числа в столбце PersonID, например

1005
1007
1012 
1013

Нужно найти только пропущенные числа.

Примечание: В моей таблице более 20 миллионов записей.Поэтому, пожалуйста, предложите более быстрый способ найти нужные числа.

Ответы [ 3 ]

0 голосов
/ 04 апреля 2019

Создайте еще одну таблицу и заполните все числа между минимальным и максимальным диапазонами PersonID. Сделайте анти-соединение (влево / вправо), чтобы получить список пропущенных номеров.

select * from NewIDTable a
left join OriginalTable b  on a.PersonID=b.PersonID
where b.Personid is null
0 голосов
/ 11 апреля 2019

Спасибо всем, кто поддержал и поделился некоторыми моментами.Я нашел способ найти пропавших без вести, используя ROWNUMBER ().

 SELECT
 NOTEXIST  FROM  ( 
 SELECT  ROW_NUMBER() OVER (ORDER BY PERSONID) NOTEXIST ,PERSONID  FROM  #A )  T
 WHERE NOTEXIST NOT IN  ( SELECT PERSONID  FROM  PERSONID )
0 голосов
/ 04 апреля 2019

Самый простой способ - получить диапазоны . Вы можете сделать это с помощью lead():

select personid + 1, next_personid - 1 as end_range,
       next_personid - personid - 1 as num_missing
from (select t.*,
             lead(personid) over (order by personid) as next_personid
      from t
     ) t
where next_personid <> personid + 1;

Если вам все еще нужен список идентификаторов, вы можете расширить диапазоны, но это зависит от базы данных.

В SQL Server 2008 это значительно повышает производительность, но вы можете сделать это:

select personid + 1, tnext.personid - 1 as end_range,
       text.personid - personid - 1 as num_missing
from t cross apply
     (select top (1) t2.person_id
      from t t2
      where t2.personid > t.person_id
      order by t2.personid asc
     ) tnext
where tnext.personid <> personid + 1;
...