我的数据库中有一个新列,我需要用特定行中同一列的值来填充它。我想创建一个“全部复制”功能
例如,将相同的价格添加到第一行中获取的所有产品中:
%ld
我正在尝试选择第一行(ID 1)的PRICE,并将其复制到所有其他行。
我尝试过:
ID NAME PRICE
1 PROD1 5
2 PROD2 0
3 PROD3 0
4 PROD4 0
我想结束这个
UPDATE PRODUCTS SET PRICE = (select PRICE from PRODUCTS where ID = 1);
但是我得到这个错误:
ID NAME PRICE
1 PROD1 5
2 PROD2 5
3 PROD3 5
4 PROD4 5
我尝试分别指定每个表
Table 'PRODUCTS' is specified twice,
both as a target for 'UPDATE' and as a separate source for data
但是我遇到同样的错误。
UPDATE PRODUCTS as a SET a.PRICE = (select b.PRICE from PRODUCTS as b where b.ID = 1);
也许我必须创建一个临时表并从中复制? 关于如何完成此操作的任何提示? 谢谢。
答案 0 :(得分:1)
您可以通过嵌套选择查询来做到这一点:
UPDATE PRODUCTS
SET PRICE = (
select PRICE from (select PRICE from PRODUCTS where ID = 1) t
);
请参见demo。
另一种方法是使用自我CROSS JOIN:
UPDATE PRODUCTS p CROSS JOIN (
select PRICE from PRODUCTS where ID = 1
) t
SET p.PRICE = t.PRICE;
请参见demo。
答案 1 :(得分:0)
这在逻辑上是行不通的,因为SQL会尝试获取要更新的数据。
尝试分别运行嵌套语句select PRICE from PRODUCTS where ID = 1
,保存响应,然后运行主语句:"UPDATE PRODUCTS SET PRICE = " + newPrice
答案 2 :(得分:0)
查看了其他帖子和网站上的许多答案之后(没有一个答案是准确的),我找到了该查询的解决方案,是的,我们需要临时表:
CREATE TEMPORARY TABLE tmptable SELECT ID, PRICE FROM PRODUCTS WHERE ID = 1;
UPDATE PRODUCTS SET `PRICE` = (select tmptable.`PRICE` from tmptable where tmptable.ID = 1);
但是! @forpas解决方案非常好,并且无需创建临时表即可工作。
享受。
新问题:临时表是否自动删除?给我留言。 干杯
答案 3 :(得分:0)
如果这是一个SQL脚本,建议您使用一个变量将其分为2个查询:
select @var := PRICE from PRODUCTS where ID = 1;
UPDATE PRODUCTS SET PRICE = @var;
在我看来,变量比临时表容易得多。
我还没有完全测试过,但是语法应该是