#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.