【问题标题】:SQL update code with 'Where exisits' not acting as expectedSQL 更新代码与“在哪里存在”未按预期运行
【发布时间】:2015-10-05 15:08:17
【问题描述】:

我尝试编写一些 SQL 更新代码,在带有 where exists 子句的注释字段中添加一行,但它不断更新表中的每条记录,我不确定我搞砸了什么,哈哈。如果您在下面的代码中看到我的错误并且可以帮助我,非常感谢。

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 > ' ')

【问题讨论】:

  • 子选择与主订单没有关联?所有行或没有行都将按照现在的状态更新。
  • 好的,我想我理解您对代码的看法。我只是不确定如何纠正它:/
  • 你用的是什么数据库?

标签: sql sql-server exists


【解决方案1】:

问题是您的第一个查询(更新)与第二个无关。因此,如果这有任何结果,您基本上是在更新我的所有订单:

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 > ' ')

您需要仔细检查密钥,以便您知道出了什么问题..

【讨论】:

    【解决方案2】:

    我会选择这个:

    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

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      相关资源
      最近更新 更多