2009-07-07 120 views
0

我正在运行一个查询,该查询返回的记录来自不在正确查询中的EXCEPT的左侧;从另一个表更新缺少记录的表

USE AdventureWorks; 
GO 
SELECT ProductID 
FROM Production.Product 
EXCEPT 
SELECT ProductID 
FROM Production.WorkOrder; 

比方说,有6条返回(有6条在Production.Product表,不在Production.WorkOrder)

我将如何编写查询来更新6条投产.WorkOrder表?

回答

3
insert into workorder (productid) 
select productid from product where productid not in (select productid from workorder) 

这将插入到工作单中产品表中尚未在工单中的所有productid。

+0

...其中productid不在... – Stobor 2009-07-07 03:48:01

0

我会使用一个左连接,像这样:

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; 

这从没有出现在工单产品返回所有产品ID值。其他答案(WHERE NOT IN)的问题是子查询将执行一次/行,并且如果表很大,这将非常慢。一个LEFT JOIN只会执行一次,然后SQL会将行匹配起来 - 在一张小表上,在实践中不会有太大的差别,但是在一个更大的表或生产数据库中,差异将是巨大的。

0

只要把你的查询变成一个INSERT?

INSERT INTO Production.WorkOrder(ProductID, ...) 
SELECT ProductID, ... 
FROM Production.Product 
EXCEPT 
SELECT ProductID 
FROM Production.WorkOrder; 
相关问题