Удалить запрос с помощью инструкции join

#sql #sql-server

#sql #sql-сервер

Вопрос:

 Delete  mfg_product_specification 
from mfg_product_specification
join dbo.spec_attribute  on mfg_product_specification.attribute_id=spec_attribute.attribute_id 
where spec_attribute.attribute_name = 'MEMSEL_SLOTS_NUM'
and mfg_product_specification.mfg_product_id in (247174) 
and  mfg_product_specification.value='' 
 

Я хотел бы удалить запись из mfg_product_specification таблицы. Нужно ли указывать mfg_product_specification after delete ? Есть ли какой-либо другой способ использования delete оператора с помощью join оператора? Является ли приведенное выше лучшим способом или единственным способом сделать это, или мое соединение может быть изменено для выполнения a delete также в более безопасном процессе?

Комментарии:

1. Пожалуйста, обратите внимание, что для удаления вам не нужна инструкция select. Я отредактировал ваш вопрос.

Ответ №1:

Ваш запрос выглядит хорошо, и это безопасный способ использования соединения. Да, когда вы объединяете две таблицы, вам нужно определить одно имя таблицы после delete инструкции.

Я бы просто рекомендовал написать inner join вместо join . Это то же самое, но становится более понятным, что вам действительно нужен an inner join , а не left join or right join .

 Delete  mfg_product_specification 
from mfg_product_specification
    inner join dbo.spec_attribute  on mfg_product_specification.attribute_id=spec_attribute.attribute_id 
where spec_attribute.attribute_name = 'MEMSEL_SLOTS_NUM'
    and mfg_product_specification.mfg_product_id in (247174) 
    and  mfg_product_specification.value=''
 

Ответ №2:

Я предпочитаю использовать exists в этом контексте:

 Delete  ps
from mfg_product_specification ps
where ps.mfg_product_id in (247174) and
      ps.value = '' and
      exists (select 1
              from dbo.spec_attribute sa
              where ps.attribute_id = sa.attribute_id and
                    sa.attribute_name = 'MEMSEL_SLOTS_NUM'
             );
 

Я считаю, что логике проще следовать: удалите записи из ps этого, соответствующие следующим условиям.

Я просто не связываюсь JOIN с DELETE — и это потому JOIN , что концептуально создает «новый результат», который по сути является подмножеством декартова произведения, удаленным из исходных таблиц. Кроме того, EXISTS гарантирует, что каждая строка будет удалена только один раз. Однако JOIN может генерироваться несколько копий строки, если значение JOIN не равно 1-1.