удалить функциональную добавочную нагрузку на сервере sql - PullRequest
0 голосов
/ 04 июля 2018

Мне нужно удалить записи, которые присутствуют в целевой таблице, но отсутствуют в исходной таблице. Первичный ключ в таблице назначения - это идентификатор auto_increment, которого нет в исходной таблице. И исходная, и целевая таблицы содержат набор уникальных комбинаций клавиш, которые можно использовать для уникальной идентификации строк в обеих таблицах. Какому подходу я должен следовать? Как я могу удалить, если я буду использовать несколько комбинаций столбцов в качестве уникального ключа, а не один первичный ключ (нет в источнике)?

 delete from dest_table
 where (uniq_key_col1,uniq_key_col2) not in (
   select dest.uniq_key_col1,dest.uniq_key_col2 
   from dest_table dest
   join source_table source
   on dest.uniq_key_col1=source.uniq_key_col1
   and dest.uniq_key_col2=source.uniq_key_col2
 )

Вот как это должно выглядеть в идеале (только для ясности и, пожалуйста, игнорируйте ошибку в предложении where из-за нескольких столбцов)

Ответы [ 4 ]

0 голосов
/ 04 июля 2018

Звучит так, будто НЕ СУЩЕСТВУЕТ - это то, что вам нужно

DELETE d FROM dest_table d 
WHERE NOT EXISTS (SELECT (PUT_APPROPRIATE_COLUMNS_HERE) from source_table s 
   WHERE d.col1 = s.col
   AND d.col2 = s.col2
   ... etc for other columns
   )

Обратите внимание на псевдоним таблицы, он вам нужен. И может быть более целесообразно использовать внутреннее соединение, если это возможно с вашими данными.

0 голосов
/ 04 июля 2018

Вы можете сделать так:

DELETE
FROM dbo.dest a 
WHERE NOT EXISTS (
      SELECT 1
        FROM dbo.source1 b
       WHERE a.id1 = b.ID1 and a.id2 = b.id2
      )
0 голосов
/ 04 июля 2018

Еще один вариант для вас

DELETE dest_table
FROM dest_table
    LEFT JOIN source_table
        ON dest_table.uniq_key_col1 = source_table.uniq_key_col1
            AND dest_table.uniq_key_col2 = source_table.uniq_key_col2
WHERE source_table.uniq_key_col1 IS NULL
0 голосов
/ 04 июля 2018

Вы можете использовать существует. то есть:

delete from dest_table
 where not exists (
   select * 
   from source_table source
   where dest_table.uniq_key_col1=source.uniq_key_col1
   and dest_table.uniq_key_col2=source.uniq_key_col2
 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...