【问题标题】:Sql Update - Ambiguous column nameSql 更新 - 不明确的列名
【发布时间】:2017-04-14 14:55:56
【问题描述】:

我有以下查询将表 o 的字段 sku 更新为表 p 的字段 AutoSKU。运行它给我错误:“不明确的列名'sku'”。我也知道问题是因为引擎不知道我在 WHERE 条件下谈论的是哪个 sku。但我需要这个条件来确保每个更新行都正确映射。用 o.sku 替换 sku 会出现另一个错误“无法绑定多部分标识符“o..sku”。”。有什么想法吗?

UPDATE  o
SET     sku = p.AutoSKU
FROM    o (NOLOCK)
        JOIN a (NOLOCK) ON a.Sku = o.sku
        JOIN p (NOLOCK) ON p.Code = a.ProductCode
WHERE   o.sku <> p.AutoSKU
        AND sku = a.Sku

【问题讨论】:

  • 这里AND sku = a.Sku 你必须在第一个sku 前面加上适当的表别名。
  • 你的问题没有意义。您已经在on 子句中拥有Sku 的条件。 WHERE 子句中不需要重复。
  • 你是对的,@GordonLinoff。我只是担心引擎将更新查询中的 o 表与 FROM 子句中的 o 表区别对待。谢谢!

标签: sql sql-server tsql sql-update


【解决方案1】:

这很可能是由于最后一行 - AND sku = a.Sku 您需要为第一个 sku 列起别名,如下所示:

UPDATE  o
SET     sku = p.AutoSKU
FROM    o (NOLOCK)
        JOIN a (NOLOCK) ON a.Sku = o.sku
        JOIN p (NOLOCK) ON p.Code = a.ProductCode
WHERE   o.sku <> p.AutoSKU
        AND o.sku = a.Sku -- a bit redundant

尽管正如@GordonLinoff 提到的,您不需要在WHERE 子句中使用该条件,因为您已经在ON 子句中拥有它。

【讨论】:

  • 正如我提到的,这会带来错误。我已经试过了。但是戈登是正确的,我在没有这种情况的情况下再次尝试过,它带来了正确的结果。谢谢!
【解决方案2】:

这应该没问题:

UPDATE o
    SET sku = p.AutoSKU
    FROM o JOIN
         a 
         ON a.Sku = o.sku JOIN
         p
         ON p.Code = a.ProductCode
    WHERE o.sku <> p.AutoSKU;

ON 子句已经具有skus 上的条件。无需在WHERE 子句中重复。

此外,请勿使用WITH (NOLOCK),除非您非常有意使用它并且您知道它的作用。

最后,您的错误消息表明您在该版本的查询中有错字。 o..skuo.sku 不是一回事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多