删除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
,如果不存在,请将其删除。