Как найти отсутствующие записи (ID) из индексированной таблицы [order] в sql - PullRequest
0 голосов
/ 08 января 2020

У меня есть таблица [Order], в которой есть записи с последовательным идентификатором (только в нечетном числе, то есть 1,3,5,7 ... 989, 991, 993, 995, 997, 999), видно, что несколько записей были случайно удалены и должны быть вставлены обратно, во-первых, чтобы выяснить, какие записи отсутствуют в текущей таблице, в этой таблице есть сотни записей

Не знаю, как написать запрос Кто-нибудь может помочь, пожалуйста?

Я думаю, если мне нужно написать хранимую процедуру или функцию, но было бы лучше, если бы я мог избежать их по причинам среды.

Ниже код peuso что я думаю:

set @MaxValue = Max(numberfield)
set @TestValue = 1
open cursor on recordset ordered by numberfield
foreach numberfield
 while (numberfield != @testvalue) and (@testvalue < @MaxValue) then
  Insert @testvalue into #temp table
  set @testvalue = @textvalue + 2
 Next
Next

ОБНОВЛЕНИЕ:

enter image description here

Ожидаемый результат:

Идентификатор заказа = 7 должен быть выбран как единственная отсутствующая запись.

Обновление 2:

Если я использую

WHERE
    o.id IS NULL;

Это ничего не возвращает:

enter image description here

Ответы [ 2 ]

1 голос
/ 08 января 2020

Поскольку я не получил от вас ответа, в комментариях я изменил скрипт для вас, чтобы он заполнял соответственно:

declare @id int
declare @maxid int

set @id = 1
select @maxid = max([Your ID Column Name]) from [Your Table Name]

declare @IDseq table    (id int)

while @id < @maxid --whatever you max is
begin
    insert into @IDseq values(@id)

    set @id = @id + 1
end

select 
    s.id 
from        @IDseq s 
left join   [Your Table Name] t on s.id = t.[Your ID Column Name]
where t.[Your ID Column Name] is null

Там, где вы видите [Your ID Column Name], замените все на Ваше имя столбца и то же самое относится к [Your Table Name].

Я уверен, что это даст вам результаты, которые вы ищете.

0 голосов
/ 08 января 2020

Мы можем попытаться присоединиться к таблице чисел, которая содержит все нечетные числа, которые вы могли бы ожидать, чтобы появиться в вашей собственной таблице.

DECLARE @start int = 1
DECLARE @end int = 1000

WITH cte AS (
    SELECT @start num  
    UNION ALL
    SELECT num + 2 FROM cte WHERE num < @end 
)

SELECT num
FROM cte t
LEFT JOIN [Order] o
    ON t.num = o.numberfield
WHERE
    o.numberfield IS NULL;
...