Stack Overflow на русском Asked on December 5, 2021
Есть таблица, состоящая из 1 столбца Client
и 100 строк. В этом столбце, неповторяющиеся числа от 1 до 100.
Из таблицы произвольным образом была удалена 1 строка.
Как с помощью SQL запроса определить, какая строка была удалена?
Достаточно очевидно, что неповторяющиеся числа от 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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP