TransWikia.com

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

Stack Overflow на русском Asked on December 5, 2021

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

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

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

3 Answers

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

Answered by Сергей Коновалов on December 5, 2021

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    
/

Answered by 0xdb on December 5, 2021

Можно сделать так. Вам нужно сгенерировать саму последовательность 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;

Answered by Aziz Umarov on December 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP