使用连接语句删除查询


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 joinright 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中删除记录。

我根本不JOINDELETE联系起来——那是因为JOIN概念上创建了一个"新结果",它本质上是笛卡尔乘积的一个子集,从原始表中删除。 此外,EXISTS保证每行只尝试删除一次。 但是,如果JOIN不是 1-1,JOIN可能会生成行的多个副本。

最新更新