删除SQL联接中的全部或无
我的桌子:删除SQL联接中的全部或无,sql,tsql,left-join,Sql,Tsql,Left Join,我的桌子: SalesOrderHead id 1 2 3 SalesOrder id SalesOrderHeadID 1 1 2 1 3 1 JobOrder id SalesOrderID 1 1 2 2 3
SalesOrderHead
id
1
2
3
SalesOrder
id SalesOrderHeadID
1 1
2 1
3 1
JobOrder
id SalesOrderID
1 1
2 2
3 3
如果saleorder
中不存在属于给定saleorder
的行,我想从saleorderhead
和saleorder
中删除。i、 e.如果salesforder
中存在任何JobOrder
行,则应回滚。
现在如果我写了这样一个错误的查询
DELETE
SO
FROM
SalesOrder SO
LEFT JOIN JobOrder JO ON
JO.SalesOrderLineID = SO.id
WHERE
JO.id IS NULL
AND
SO.id in
(
SELECT
id
FROM
SalesOrder
WHERE
SalesOrderID = 1
)
Delete from SalesOrderHead where id = 1
它将从
销售订单
中删除一些行您可以在中使用,在
中不使用
Delete from SalesOrderHead where id in (
select id from SalesOrder where id not in (
select SalesOrderLineID from JobOrder
)
)
您可以将查询编写为:
--Store deleted Id's from Primary table: SalesOrderHead
DECLARE @tblDeletedID TABLE ( ID INT );
DELETE FROM SOH
OUTPUT DELETED.id INTO @tblDeletedID
FROM SalesOrderHead AS SOH
where SOH.id not in
(select SO.SalesOrderHeadID
from SalesOrder SO
join JobOrder JO on JO.SalesOrderID = SO.id
)
--Now delete from child table: SalesOrder
DELETE from SO
FROM SalesOrder SO
INNER JOIN @tblDeletedID Deleted
ON SO.SalesOrderHeadID = Deleted.id;
如果您看到相关数据被删除,很可能您在数据库中设置了删除级联,或者设置了触发器。什么是完整的表和关系(外键约束)定义?saleorder FK\u salesforder\u salesforderhead job order FK\u job order\u salesforder
我想同时从salesforderhead和salesforder中删除。SalesOrderHeadID在SalesOrder中为fk。SalesOrderLineID在中为fkJobOrder@awaisharoon,mysql?microsoft sql Server从SO头中删除首先引发引用约束冲突。由于外键约束,必须首先从工单
中删除,然后从销售订单
中删除,最后从销售订单
中删除。我先从joborder中删除,然后从salesorder中删除,然后在同一事务中从salesOrderHead中删除,如果数据库表“salesorder”中存在记录,则生成foreignkey异常。然后我回滚这个事务。这解决了我的问题,但这是正确的方法吗?不是从JobOrder中删除。我检查JobOrder中是否存在SalesOrder
,如果不存在,请将其删除。