2015-10-05 51 views
0

我試圖製作一些SQL更新代碼,它使用where exists子句將一行添加到notes字段,但它不斷更新表中的每條記錄,我不確定我搞砸了大聲笑。如果你在下面的代碼中看到我的錯誤,並且可以幫助我非常感謝。SQL更新代碼'Where Exisits'未按預期行事

UPDATE Orders 
SET notes = 'Basic Confirmation Issued by TaskCentre: ' + CONVERT(varchar(10),getdate(),121) 
WHERE EXISTS (SELECT * 
FROM Orders INNER JOIN Order_Lines ON orders.ORDER_NUMBER = Order_Lines.ORDER_NUMBER 
WHERE Orders.ORDER_DATE >= '20150630 00:00:00' 
AND Order_Lines.PRODUCT_CODE LIKE '15CONF%%' 
AND Orders.Email > ' ') 
+0

子選擇與主訂單沒有關聯嗎?無論是全部行還是全部行都將按照現在的情況進行更新。 – jarlh

+0

好吧,我想我理解你對代碼的觀點。我只是不知道我是如何糾正它的:/ –

+0

你使用了哪個數據庫? –

回答

3

問題是您的第一個查詢(更新)與第二個查詢沒有關係。所以,你基本上是在做更新所有我的訂單如果有任何結果:

SELECT * 
FROM Orders INNER JOIN Order_Lines ON orders.ORDER_NUMBER = Order_Lines.ORDER_NUMBER 
WHERE Orders.ORDER_DATE >= '20150630 00:00:00' 
AND Order_Lines.PRODUCT_CODE LIKE '15CONF%%' 
AND Orders.Email > ' ' 

你需要重寫查詢的方式,第一個與第二個有關。或者你也可以做的是,而不是使用*作爲你的選擇,返回ID。然後更新您的第一個查詢的WHERE子句來搜索第二的關鍵,類似的東西:

UPDATE Orders 
SET notes = 'Basic Confirmation Issued by TaskCentre: ' + CONVERT(varchar(10),getdate(),121) 
WHERE order_number IN (SELECT ORDER_NUMBER 
FROM Orders INNER JOIN Order_Lines ON orders.ORDER_NUMBER = Order_Lines.ORDER_NUMBER 
WHERE Orders.ORDER_DATE >= '20150630 00:00:00' 
AND Order_Lines.PRODUCT_CODE LIKE '15CONF%%' 
AND Orders.Email > ' ') 

你需要仔細檢查的鑰匙,只是你可以有一個想法,什麼是錯的..

0

我會用這個去:

UPDATE o 
SET notes = 'whatever' 
FROM orders o 
WHERE o.ORDER_DATE >= '20150630 00:00:00' 
    AND o.Email > ' ' 
    AND o.ORDER_NUMBER IN 
     (SELECT ol.ORDER_NUMBER 
     FROM Order_Lines ol 
     WHERE ol.PRODUCT_CODE LIKE '15CONF%%' 
    ) 

,如果你有很多的訂單我會添加索引:

create index order_date on orders(order_date) 
    include (order_number) 
    where email > ' '; 

fiddle