Как удалить обратное значение в Oracle База данных с помощью запроса? - PullRequest
1 голос
/ 17 февраля 2020

Допустим, у меня есть некоторые данные в базе данных Oracle, как я упоминал выше.

TABLE

       COLUMN1 | COLUMN2 | Quantity

        100    |  2000   |     1
       2000    |  100    |     5
       3000    |  100    |     2

Как вы можете видеть, столбец1 и столбец2 обращены к данным. Каков эффективный способ очистки этих данных от oracleDb. Меня не волнует, что можно удалить. Моя главная цель - если таблица содержит обратные данные, одно из них должно быть удалено. Мне этого достаточно.

Ответы [ 3 ]

1 голос
/ 17 февраля 2020

Самый простой способ сделать это - использовать EXISTS, как показано в следующем примере:

Oracle Настройка данных:

SQL> CREATE TABLE TBL (COL1, COL2, QUANTITY)
  2  AS SELECT * FROM
  3  (
  4  SELECT 100, 2000, 1 FROM DUAL UNION ALL
  5  SELECT 2000, 100, 5 FROM DUAL UNION ALL
  6  SELECT 3000, 100, 2 FROM DUAL
  7  );

Table created.

Текущие данные:

SQL> SELECT * FROM TBL;

      COL1       COL2   QUANTITY
---------- ---------- ----------
       100       2000          1
      2000        100          5
      3000        100          2

Запрос на удаление дубликата:

SQL> DELETE FROM TBL T
  2  WHERE EXISTS (
  3          SELECT 1
  4          FROM TBL TIN
  5          WHERE T.COL1 = TIN.COL2
  6              AND T.COL2 = TIN.COL1
  7              AND T.ROWID > TIN.ROWID
  8      );

1 row deleted.

Текущий просмотр данных:

SQL> SELECT * FROM TBL;

      COL1       COL2   QUANTITY
---------- ---------- ----------
       100       2000          1
      3000        100          2

Ура !!

0 голосов
/ 17 февраля 2020

Вы можете удалить данные разными способами. Я мог бы предложить:

delete from t
    where t.col1 > t.col2 or
          exists (select 1
                  from t t2
                  where t2.col1 = t.col2 and t2.col2 = t.col1
                 );

Тогда. , , более важная вещь. Предотвратите это в будущем с помощью уникального ограничения / индекса:

create unique index unq_t_col1_col2 on
     t(least(col1, col2), greatest(col1, col2));

На самом деле, я бы исправил данные так col1 < col2 всегда и добавил бы ограничения:

unique (col1, col2),
check (col1 < col2)

Ничего вроде поддержания чистоты данных для обеспечения безопасности вашей базы данных.

0 голосов
/ 17 февраля 2020

Позвольте мне назвать ваш стол T.

select *
from T T1 join T T2
     on T1.column1 = T2.column2
     and T1.column2 = T2.column1;

Дает вам пары. Каждая пара встречается дважды из-за симметрии.

Чтобы удалить их, вы можете сделать

delete from T
where rowid in (
    select T1.rowid
    from T T1 join T T2
         on T1.column1 = T2.column2
         and T1.column2 = T2.column1
    where T1.rowid < T2.rowid
);

Примечание: я не проверял это. Я оставляю это на ваше усмотрение.

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