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
记录。我需要在delete
后指定mfg_product_specification
吗?有没有其他方法使用delete
语句使用join
语句?以上是最好的方法还是唯一的方法,或者是否可以修改我的联接以在更安全的过程中也进行delete
?
您的查询看起来不错,这是使用联接的安全方法。是的,当您连接两个表时,您需要在delete
语句后定义一个表名。
我只是建议写inner join
而不是join
.是一样的,但它更清楚地表明你真的想要一个inner join
,而不是一个left join
或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=''
我倾向于在这种情况下使用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
不是 1-1,JOIN
可能会生成行的多个副本。