Sql server 更新另一个表中缺少记录的表

Sql server 更新另一个表中缺少记录的表,sql-server,tsql,Sql Server,Tsql,我正在运行一个查询,该查询将返回除不在右侧查询之外的其他记录 USE AdventureWorks; GO SELECT ProductID FROM Production.Product EXCEPT SELECT ProductID FROM Production.WorkOrder; 假设有6条记录返回。有6条记录在Production.Product表中,但不在Production.WorkOrder中 如何编写查询以将6条记录更新到Production.WorkOrder表中 i

我正在运行一个查询,该查询将返回除不在右侧查询之外的其他记录

USE AdventureWorks;
GO
SELECT ProductID 
FROM Production.Product
EXCEPT
SELECT ProductID 
FROM Production.WorkOrder;
假设有6条记录返回。有6条记录在Production.Product表中,但不在Production.WorkOrder中

如何编写查询以将6条记录更新到Production.WorkOrder表中

insert into workorder (productid)
select productid from product where productid not in (select productid from workorder)
这将在workorder中插入产品表中尚未在workorder中的所有productid


这将在workorder中插入product表中尚未在workorder中的所有productid。

我将使用左联接,如下所示:

USE AdventureWorks;
GO
SELECT p.ProductID
  FROM Production.Product p
  LEFT
  JOIN Production.WorkOrder wo
    ON p.ProductID = wo.ProductID
 WHERE wo.ProductID IS NULL;

这将返回产品中未出现在WorkOrder中的所有ProductID值。另一个答案的问题是,子查询将每行执行一次,如果表很大,则执行速度会非常慢。左连接只执行一次,然后SQL将匹配行-在一个小表上,实际上不会有太大差异,但在一个较大的表或生产数据库中,差异将是巨大的。

我会使用左连接,如下所示:

USE AdventureWorks;
GO
SELECT p.ProductID
  FROM Production.Product p
  LEFT
  JOIN Production.WorkOrder wo
    ON p.ProductID = wo.ProductID
 WHERE wo.ProductID IS NULL;

这将返回产品中未出现在WorkOrder中的所有ProductID值。另一个答案的问题是,子查询将每行执行一次,如果表很大,则执行速度会非常慢。左连接只执行一次,然后SQL将匹配行-在一个小表上,实际上不会有太大差异,但在一个较大的表或生产数据库中,差异将是巨大的。

只需将查询转换为插入

INSERT INTO Production.WorkOrder(ProductID, ...)
SELECT ProductID, ...
FROM Production.Product
EXCEPT
SELECT ProductID 
FROM Production.WorkOrder;

只需将您的查询转换为插入

INSERT INTO Production.WorkOrder(ProductID, ...)
SELECT ProductID, ...
FROM Production.Product
EXCEPT
SELECT ProductID 
FROM Production.WorkOrder;

我发誓,总有一天我会第一次用语法正确的代码回复。干杯,斯托博尔。如果子查询中有可能出现空值,请不要从workorder中选择productid,而是使用从workorder中选择productid,其中productid不为空。我发誓,总有一天我会用第一次语法正确的代码回复。干杯,斯托博尔。如果子查询中有可能出现null,请使用select productid from workorder,而不是从workorder中选择productid,其中productid不为null