【问题标题】:How to reference the same column multiple times with UPDATE -- SQL Server Mgmt Studio 2012如何使用 UPDATE 多次引用同一列 -- SQL Server Mgmt Studio 2012
【发布时间】:2023-03-16 13:40:01
【问题描述】:

我有一个数据库,其中包含特定项目的食谱。我想创建一个更新语句,根据配方中成分的成本更新所有项目成本。我相信我正在处理的问题是成分和使用它们的物品的价值“成本”位于同一张表中。我已经设法写了一个声明,它只更新了一个项目的成本,但我似乎无法让它适用于所有有配方的项目。附件是一个项目的功能声明和我试图为所有项目撰写的声明。

这是返回正确值的语句,但仅适用于一个特定的项目编号。

UPDATE inventory
SET inventory.cost = (SELECT SUM(inventory_ingredients.quantity * inventory.cost)
                      FROM inventory_ingredients, inventory
                      WHERE inventory.itemnum = inventory_ingredients.ingredient
                        AND inventory_ingredients.itemnum = 'BeesKnees1200'
                      GROUP BY inventory_ingredients.itemnum)
WHERE inventory.itemnum = 'BeesKnees1200'

这是我试图编写的语句,它将使用该 SUM 更新所有 Inventory.Cost

UPDATE inventory 
SET inventory.cost = (SELECT SUM(inventory_ingredients.quantity * inventory.cost)
                      FROM inventory_ingredients, inventory
                      WHERE inventory.itemnum = inventory_ingredients.ingredient
                      GROUP BY inventory_ingredients.itemnum)
WHERE inventory.itemnum = Inventory_ingredients.itemnum

在这种情况下,我在inventory_ingredients.itemnum 上得到“无法绑定”

我认为这里的问题是我引用了同一列两次,但我不确定如何更正它。任何想法都将不胜感激。

所附图片分别显示了 Inventory 和 Inventory_Ingredients 表的相关列。

【问题讨论】:

  • 你需要在那里使用 CTE
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它
  • @marc_s 我非常感谢您的建议。我刚开始学习 SQL,没有接受过正规教育,所以我喜欢专业人士的建议;但是,那里的链接似乎不想打开。我还能在哪里看到您所引用的任何想法?

标签: sql sql-server tsql


【解决方案1】:

如果您将查询更改为

;WITH CTE AS
(
SELECT SUM(ISNULL(TRY_CAST(II.quantity AS INT), 1) * I.cost) * 1.0000 S,
       II.itemnum
FROM inventory_ingredients II JOIN inventory I ON I.itemnum = II.ingredient
GROUP BY II.itemnum
)
UPDATE inventory 
SET inventory.cost = CTE.S
FROM inventory JOIN CTE ON inventory.itemnum = CTE.itemnum;

【讨论】:

  • 在我尝试这个之前,我担心在没有 WHERE 的情况下执行更新。是不是被这里的 JOIN 取代了?
  • 这部分查询返回正确的成本(耶!) GROUP BY Inventory_Ingredients.itemnum] 但是在底部 JOIN 中有些东西不太有效。它会更新所有适当的字段,但输入的值不正确。
  • @RedDevil 看不到你的数据,底部JOIN有什么问题?
  • 让我再看看@Sami,等一下
  • 更正:所以问题实际上在于某些数量不是整数值。我发现它返回的更新成本假定 inventory_ingredients.quantity 为 1。顺便说一下,我非常感谢您的帮助。
【解决方案2】:

试试这段代码,让我知道它是否适合你:

UPDATE inventory 
    SET inventory.cost = (SELECT SUM(inventory_ingredients.quantity*inventory.cost)
    FROM inventory_ingredients II, inventory I
    WHERE I.itemnum=II.ingredient and i.itemnum = inventory.itemnum 
    GROUP BY II.itemnum)

【讨论】:

  • 在 UPDATE 子句中没有任何 where 条件,我建议不要尝试这个....除非你将它包装在一个带有回滚的事务中。
  • @Ehsan,在您的 AND 中,意思是“inventory.itemnum=inventory.itemnum”吗?
  • 不,Inventory 用于更新级别,但 i 用于内部连接库存。这样,查询会自动检查项目编号。
  • 我们正在构建的外部库存是基于 group by 构建的。内部库存 i 是原始库存表。
猜你喜欢
  • 1970-01-01
  • 2015-12-25
  • 2014-07-24
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2013-11-28
  • 1970-01-01
相关资源
最近更新 更多