1

我有下表

#key | #value
colour | red
weather | blue

现在我想用键颜色将行的值更新为键天气的行的值。所以我在做:

UPDATE table_name 
SET value = (SELECT value FROM table_name WHERE key = "weather") 
WHERE key = "colour";

但是这个更新给了我以下错误信息:

您不能在 FROM 子句中指定要更新的目标表

我怎样才能不出错地进行该查询?

4

4 回答 4

1

这可能是因为select查询可能会为该列返回多个值value

UPDATE table_name 
SET value = (SELECT max(value) FROM table_name WHERE key = "weather")
WHERE key = "colour";

或者

UPDATE table_name 
SET value = (SELECT value FROM table_name WHERE key = "weather" limit 1) 
WHERE key = "colour";

table_name您可以尝试通过将子查询中的实例替换为(SELECT * FROM table_name)

UPDATE table_name 
SET table_name.A =
(
    SELECT B
    FROM (SELECT * FROM table_name) AS something
    INNER JOIN ...
)

另请检查如何从 MySQL 中的更新目标中进行选择

您不想在现实生活中只在子查询中使用 SELECT * FROM 表;我只是想让示例保持简单。实际上,您应该只在最里面的查询中选择您需要的列,并添加一个好的 WHERE 子句来限制结果。

编辑:-

正如您已经评论过的那样,但我已经在上面回答了使用这样的临时表:-

UPDATE table_name 
SET value = (SELECT value FROM (SELECT value FROM table_name WHERE key="weather") AS x) 
WHERE key="colour"
于 2013-11-10T11:02:21.217 回答
0

如果你的 sql 支持 'LIMIT',你可以试试这个

UPDATE table_name SET value = (SELECT value FROM table_name WHERE key = "weather" LIMIT 1 ) WHERE key = "colour";
于 2013-11-10T10:59:46.820 回答
-1
UPDATE table_name
SET colour ='red',weather =blue
WHERE column_name = some_value;
于 2013-11-10T11:02:11.733 回答
-1

它不会那样工作。您不能同时对同一个表进行读取和写入查询。使用两个不同的表,它将起作用。

UPDATE `table` SET value = (SELECT value FROM `Table_b` WHERE `other_value` = 'xy' LIMIT 1) WHERE  `key` =  'colour'
于 2013-11-10T11:25:37.097 回答