如何从关联表中删除条目,需要从另外两个表中查找

问题描述

背景

  • 列表项asset_table包含列{asset_tag,asset_id}
  • 列表项目合同表具有列{contract_number,contract_id}
  • 列表项asset_contract表具有列{contract_id,asset_id}

问题: 我有一个asset_tag以及要添加的合同编号列表和要删除的合同编号列表。

现在我执行以下操作:

  1. 从资产标签中查找资产。id。
  2. 从合同编号中查找合同ID。
  3. 执行查询以从关联表中添加删除记录。

是否可以删除单个查询中的关联,而不是3个单独的交易?

解决方法

如果要删除,一个可移植的选项使用exists

delete from asset_contract 
where exists (select 1 from asset a    where a.asset_id    = asset_contract.asset_id    and a.asset_tag       = ?)
  and exists (select 1 from contract c where c.contract_id = asset_contract.contract_id and c.contract_number = ?)

对于insert,您可以这样做:

insert into asset_contract (contract_id,asset_id)
select c.contract_id,a.asset_id
from asset a
cross join contract c
where a.asset_tag = ? and c.contract_number = ?

问号代表查询的参数(资产标签和合同编号)。