【问题标题】:multiply one column by a column in another table将一列乘以另一表中的一列
【发布时间】:2014-07-07 21:44:55
【问题描述】:

我创建了可以通过表单更新的 table1,所以如果我需要更改价格百分比,我可以无需编辑代码。 我从 csv 文件导入并创建一个临时表 2。新的临时表 2 包含项目成本,因此我需要乘以一个百分比来获得售价,因此表 1 中的价格百分比。

percent 是 table1 中的一列,我想通过行 ID 选择它,importID 是列 ID,这两个都在 table1 中,我可以通过表单更新。我需要按行 id 选择未来的增长和多个百分比。

我想将临时表 2 中的价格列乘以我的永久表 1 中的百分比列。

这是给我语法错误的部分

  SELECT percent FROM my_table1 WHERE importID = 1

这是定价更新代码

  UPDATE my_temp_table2
  SELECT percent FROM my_table1 WHERE importID = 1
  SET Price = (Price * percent);

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这应该是

    UPDATE my_temp_table2
    SET Price = Price * (SELECT percent FROM my_table1 WHERE importID = 1);
    

    这会将 my_temp_table2 中的所有价格乘以在 my_table1 中为 importID 1 找到的一个价格。

    这是使用变量的替代方法:

    SELECT @percent := percent
    FROM my_table1 WHERE importID = 1;
    
    UPDATE my_temp_table2
    SET Price = Price * @percent;
    

    【讨论】:

    • 感谢大家的帮助
    【解决方案2】:

    您似乎正在尝试“将其插入变量”,这并不是 SQL 的操作方式。

    这样的事情怎么样:

    UPDATE my_temp_table2
    SET Price = Price * (SELECT percent FROM my_table1 WHERE importID = 1);
    

    它不是超级性能,但对于一次性更新它应该可以正常工作。

    【讨论】:

    • @MarcusAdams - 虽然我很欣赏您的热情,但您所做的编辑在本质上完全是风格化的,对性能或结果的影响为零。我真的不喜欢这样的东西,但是如果你选择用这样的风格改变来“修复”他们的代码,你会让很多程序员不高兴。
    【解决方案3】:

    您想更新my_temp_table2 的所有行中的Price 列吗?通过从my_table1 返回的单行中的percent 列的值?

    这是实现这一目标的一种方法:

    UPDATE my_temp_table2 t
     CROSS
      JOIN ( SELECT p.percent
               FROM my_table1 p
              WHERE p.importID = 1
              ORDER BY p.percent
              LIMIT 1
           ) q
       SET t.Price = t.Price * q.percent
    

    如果您的问题指出importID 是my_table1 中的PRIMARY KEY(或UNIQUE KEY),您可以避免使用内联视图。内联视图查询中的 LIMIT 和 ORDER BY 子句的目的是确保返回的行不超过 1 行,并使结果具有确定性。 (还有其他方法可以做到这一点,例如 MIN() 或 MAX() 聚合。)

    如果importID 在my_table1 中是唯一的,您可以简化上面的查询,只引用表而不使用内联视图:

    UPDATE my_temp_table2 t
      JOIN my_table1 q
        ON q.importID = 1
       SET t.Price = t.Price * q.percent
    

    在运行 UPDATE 之前先将其编写为 SELECT 语句通常是有益的。只需将UPDATE 关键字替换为SELECT ... FROM,并删除SET 子句。例如:

    SELECT t.Price             AS `old_price`
         , q.percent           AS `percent`
         , t.Price * q.percent AS `new_price`
      FROM my_temp_table2 t
      JOIN my_table1 q
        ON q.importID = 1
    

    将SELECT ... FROM 替换为UPDATE 关键字,将其改回UPDATE,并添加SET 子句(将返回new_price 的表达式的结果分配给Price 列。

    请注意,如果在my_table1 中没有找到匹配的行,则查询/更新将返回/更新零行。

    如果您不使用 JOIN 操作,而是在 SET 子句中使用子查询,则子查询返回的 NULL 值将导致分配给 Price 列的 NULL 值.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2012-09-22
      • 2019-02-23
      相关资源
      最近更新 更多