我创建了table1,我可以通过表单更新,所以如果我需要更改价格百分比,我可以不需要编辑代码。 我从csv文件导入并创建临时表2。新的临时表2有物品成本,所以我需要乘以百分比来得到售价,因此表1中的价格百分比。
%是table1中的一列,我想按行id选择它,importID是列ID,这两个都在table1中,我可以通过表单更新。我需要按行ID选择未来增长和多个百分比。
我想将临时表2中的price列乘以我的永久表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);
答案 0 :(得分:1)
您似乎正在尝试“将其插入变量”,这与SQL的运行方式不同。
这样的事情怎么样:
UPDATE my_temp_table2
SET Price = Price * (SELECT percent FROM my_table1 WHERE importID = 1);
它不是超级高效的,但对于一次性更新,它应该可以正常工作。
答案 1 :(得分: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 :(得分:0)
您想更新Price
所有行中的my_temp_table2
列吗?根据{{1}}返回的单行percent
列的值?
这是实现这一目标的一种方法:
my_table1
如果您的问题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
中的PRIMARY KEY
(或UNIQUE KEY
},则可以避免使用内联视图。内联视图查询中LIMIT和ORDER BY子句的目的是确保返回不超过1行,并使结果具有确定性。 (还有其他方法可以实现此目的,例如my_table1
或MIN()
聚合。)
如果MAX()
中的importID
是唯一的,您可以简化上面的查询,只需引用该表而不使用内联视图:
my_table1
在运行UPDATE之前,首先将其作为SELECT语句编写通常是有益的。只需将UPDATE my_temp_table2 t
JOIN my_table1 q
ON q.importID = 1
SET t.Price = t.Price * q.percent
关键字替换为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
子句(将返回new_price的表达式的结果分配给Price列)
请注意,如果在SET
中找不到匹配的行,则查询/更新将返回/更新零行。
如果不使用JOIN操作,而是在my_table1
子句中使用子查询,则子查询返回的SET
值将导致分配NULL
值到NULL
列。