SQL 更新代码 'Where exisits' 未按预期运行
SQL update code with 'Where exisits' not acting as expected
我试图制作一些 SQL 更新代码,用 where exists 子句向注释字段添加一行,但它不断更新 table 中的每条记录,我不确定我在做什么搞砸了哈哈。如果您在下面的代码中看到我的错误并且可以帮助我,非常感谢。
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 > ' ')
问题是您的第一个查询(更新)与第二个查询无关。因此,如果有任何结果,您基本上是在更新我的所有订单:
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 > ' '
您需要以第一个与第二个关联的方式重写您的查询。或者您还可以做的是,不要使用 * 作为您的 select、return 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 > ' ')
你需要仔细检查密钥,这样你才能知道哪里出了问题..
我会选择这个:
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 > ' ';
我试图制作一些 SQL 更新代码,用 where exists 子句向注释字段添加一行,但它不断更新 table 中的每条记录,我不确定我在做什么搞砸了哈哈。如果您在下面的代码中看到我的错误并且可以帮助我,非常感谢。
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 > ' ')
问题是您的第一个查询(更新)与第二个查询无关。因此,如果有任何结果,您基本上是在更新我的所有订单:
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 > ' '
您需要以第一个与第二个关联的方式重写您的查询。或者您还可以做的是,不要使用 * 作为您的 select、return 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 > ' ')
你需要仔细检查密钥,这样你才能知道哪里出了问题..
我会选择这个:
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 > ' ';