Удаление таблицы в Oracle с условием WHERE в других таблицах - PullRequest
0 голосов
/ 16 марта 2012

У меня есть две таблицы, A и B, в Oracle:

   A (a1, a2)

   B (b1, b2, b3, b4, b5)

И некоторые строки вроде:

  A(type1, 192.168.94.1)
   A(type1, 192.168.94.2)
   A(type2, 192.168.94.1)

   B(type1, 192, 168, 94, 1)
   B(type1, 192, 168, 94, 3)
   B(type2, 192, 168, 94, 2)

В таблице A мы имеем A (type1, 192.168.94.1)

В таблице B мы также имеем B (type1, 192, 168, 94, 1)

В таблице A я хочу удалить строку

   A(type1, 192.168.94.1)

Потому что его тип похож на тип в таблице B

   A.a1 = B.b1
   -> type1 = type1

и IP-адрес дублируется при объединении в B

   A.a2 = B.b2 ||'.'|| B.b3 ||'.'|| B.b4 ||'.'|| B.5
   -> 192.168.94.1 = 192.168.94.1

Не могли бы вы дать мне совет?

Ответы [ 4 ]

3 голосов
/ 16 марта 2012
delete from A
where ROWID in 
    (select A.ROWID
     from A,B
     where A.A1 = B.B1
     and A.A2 = concat(B.B2, B.B3, B.B4)
    )
0 голосов
/ 12 августа 2016

Я из мира SQL Server, поэтому я попробовал это:

delete 
from E_CRM_ACTIVITYPOINTER ap
   inner join tmp_activitypointer_for_delete d
       on AP.ACTIVITYID = d.activityid
where ap.current_flag = 1
    and d.start_date != AP.START_DATE

Это не сработало в моей среде Oracle 11g, поэтому я изменил это:

delete 
from E_CRM_ACTIVITYPOINTER
where (ACTIVITYID,START_DATE) in 
    (
    select AP.ACTIVITYID, AP.START_DATE
    from E_CRM_ACTIVITYPOINTER ap
        inner join tmp_activitypointer_for_delete d
        on AP.ACTIVITYID = d.activityid
    where ap.current_flag = 1
        and d.start_date != AP.START_DATE
    )

Надеюсь, это поможет кому-то еще.

0 голосов
/ 16 марта 2012

Я подозреваю, что вы не найдете ничего для удаления, потому что, возможно, вы не правильно соединяете две таблицы, потому что ваш concat даст вам concat('192', '168', '94', '1') = '192168941', что отличается от '192.168.94.1'

delete from A a
 where exists (
   select 1
     from B b
    where a.a1 = b.b1
      and a.a2 = b.b2 || '.' || b.b3 || '.' || b.b4 || '.' || b.b5)

EDIT:

Использование concat для объединения девяти параметров привело к исключению too many parameters, поэтому вместо этого я использую оператор ||.

0 голосов
/ 16 марта 2012

Вы не дали нам много информации о том, что именно вы пытаетесь сделать, но я предполагаю, что вы хотите удалить строки из A, где есть ссылка на B, вы можете попробовать:

DELETE FROM a
 WHERE EXISTS
      (SELECT 1
         FROM B
        WHERE a.a1 = b.b1
          AND a.a2 = CONCAT(b.b2, b.b3, b.b4)); 

Предположения:

1) Ссылки между таблицами A и B верны в исходном сообщении
2) Вы хотите удалить только записи из таблицы A

Надеюсь, это поможет ...

EDIT: После ваших новых комментариев вопрос еще более мрачный. Я не знаю, хотите ли вы удалить только данные столбца IP или дубликаты строк из таблицы A.

Если вы хотите просто удалить дубликаты строк из таблицы A, тогда это просто:

DELETE FROM A
 WHERE rowid NOT IN
            (SELECT MIN(rowid)
               FROM A
              GROUP BY a1, a2);

Предполагается, что столбцы a1 и a2 являются вашим основным ключом для таблицы A.

Не могли бы вы также указать, почему вы считаете, что вам вообще нужна ссылка на таблицу B?

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