Как с помощью SQL запроса найти, какая строка была удалена?

Есть таблица, состоящая из 1 столбца Client и 100 строк. В этом столбце, неповторяющиеся числа от 1 до 100.

Из таблицы произвольным образом была удалена 1 строка.

Как с помощью SQL запроса определить, какая строка была удалена?


Ответы (3 шт):

Автор решения: Aziz Umarov

Можно сделать так. Вам нужно сгенерировать саму последовательность 1..100 и соединить через left нужную таблицу.

WITH InfiniteRows (RowNumber) AS (

  SELECT 1 AS RowNumber
  UNION ALL

  SELECT a.RowNumber + 1    AS 
   RowNumber
  FROM   InfiniteRows a
  WHERE  a.RowNumber < 100
)
SELECT RowNumber
FROM   InfiniteRows
LEFT JOIN Client
ON InfiniteRows.RowNumber = Client.Id
WHERE client.id IS NULL;
→ Ссылка
Автор решения: 0xdb
create table t1 as
    select rownum id from xmlTable ('1 to 100')
/

Удалим одну случайную запись:

delete from t1 where id = trunc (dbms_random.value (1,100));

1 row deleted.

Найдём, что удалили:

select rn missing from (
    select rownum rn, id from t1 order by id)
where rn != id order by id fetch first row only 
/
   MISSING
----------
        24

Из комментария:

К примеру если записей не от 1 до 100 а до 1000000, быстро ли отработает запрос

Не знаю. Смотрите планы выполнения на реальных данных. Следующий запрос может будет быстрей, и к тому же, найдёт все "дырки", запрос выше только первую:

select  id + 1 missing
from t1 
where not exists (
    select  null
    from t1 t2
    where  t2.id = t1.id + 1)
and id != 100    
/
→ Ссылка
Автор решения: Сергей Коновалов

Достаточно очевидно, что неповторяющиеся числа от 1 до 100 - это арифметическая прогрессия. Посчитайте ее сумму, и потом SELECT (sum_of_progression - SUM(number)) AS answer FROM your_table

→ Ссылка