2013-06-04 3 views
1

У меня есть две таблицы A и B, содержащие много столбцов, два из которых используются как SKU и Typedesc.Удалить строки, присутствующие в другой таблице

Я создал таблицу C путем присоединения А и В на идентификатор и typedesc

create table C as 
    select A.* 
    from A inner join 
     B 
     on A.sku=B.sku and trim(A.typedesc)=trim(B.typedesc) 

С имеет прибл. 130000 записей

Теперь я хочу, чтобы удалить строки в которых присутствуют в C

delete from A A1 
    where exists (select 1 
        from C c1 
        where A1.sku=c1.sku and trim(A1.typedesc)=trim(c1.typedesc) 
       ) 

Это говорит 145,000 строк удаляются.

Откуда взялись дополнительные 15 000 строк? Что-то не так с моим запросом на удаление? Поэтому, когда я присоединяюсь к двум таблицам, C также должен иметь 145 000, но вместо этого он имеет только 130 000! почему это так? A или B не содержит первичного ключа.

Даже если я удалю B из A напрямую, количество удаленных строк останется 145 000.

delete from A A1 
    where exists (select 1 
        from B b1 
        where A1.sku=b1.sku and trim(A1.typedesc)=trim(b1.typedesc) 
       ) 

ответ

0

EXISTS выглядит хорошо, но не видя, какие строки удаляются, трудно сказать, в чем проблема, и я не хочу, чтобы просмотреть 145,000 строк больше, чем вы :)

Попробуйте эту альтернативу и посмотрите, не имеет значения:

DELETE FROM A 
WHERE (SKU, TRIM(TypeDesc)) IN (SELECT SKU, TRIM(TypeDesc) FROM B) 
Смежные вопросы