Удаление результатов из подзапроса в базе данных Oracle - PullRequest
0 голосов
/ 14 марта 2019

Я испортил таблицу базы данных и теперь в ней есть несколько дубликатов.Теперь я хочу удалить все дубликаты.Я нашел их все с помощью следующего запроса:

select order_uuid, changed_at, count(*)
from mobisl_1.t_order_states
group by order_uuid, changed_at
having count (*) > 1;

Дубликаты определяются столбцами 'order_uuid' и 'change_at'.Если комбинация обоих встречается в таблице более одного раза, она определяется как дубликат.

Я получаю набор результатов из 904 строк.Набор результатов, как я ожидал.Теперь я хочу удалить эти дубликаты с помощью

delete from mobisl_1.t_order_states
where ORDER_UUID in (
    select order_uuid, changed_at, count(*)
    from mobisl_1.t_order_states
    group by order_uuid, changed_at
    having count (*) > 1
);

. Затем Oracle отображает ошибку ORA-00913: слишком много значений.Что я могу сделать здесь?Я уже пытался ограничить размер результирующего набора некоторым условием (только получить строки с датой ниже x), но без положительного результата.

1 Ответ

0 голосов
/ 14 марта 2019

Ответ на ваш вопрос заключается в использовании кортежей и удалении count(*) из select:

delete
    from mobisl_1.t_order_states
where (ORDER_UUID, changed_at) in
         (select order_uuid, changed_at
          from mobisl_1.t_order_states
          group by order_uuid, changed_at
          having count(*) > 1
         );

Это отвечает на вопрос, который вы задали.Тем не менее, я не думаю, что это то, что вы действительно хотите сделать.Обычно я хотел бы сохранить одну строк с дубликатами.

Если вы хотите сохранить одну из строк, то проведите какое-нибудь исследование или задайте другой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...