2015-10-05 54 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