2009-07-07 99 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;