如何使用查询结果更新单个列的值?

时间:2014-10-16 10:05:46

标签: mysql sql

我无法在mysql中使用此查询:

UPDATE proyects_c 
   SET director=(SELECT users.keyid 
                   FROM users,proyects 
                  WHERE users.username=proyects.director
                );

现在的问题是子查询返回多行。事情是,这就是我想要的。它返回的行数与proyects_c中的行数相同,因此我期望这样做是使用查询结果更新列director中的每一行。

然而我收到错误:

ERROR 1242 (21000) at line 23: Subquery returns more than 1 row

这是有道理的,但我不能让它做我想要的。我做错了什么?

作为第二个问题,我如何将其拆分为两个查询?为了清楚起见。

3 个答案:

答案 0 :(得分:1)

也许是这样的:

update proyects_c p
inner join users u on
    u.username = p.director
set p.director = u.keyid

答案 1 :(得分:0)

你需要在T-SQL中的select中指定“Top 1”,或者在MySQL中指定“LIMIT 1”(如果内存服务)只返回一行。

尝试(假设T-SQL):

UPDATE proyects_c SET director=(SELECT TOP 1 users.keyid FROM users,proyects WHERE users.username=proyects.director);

答案 2 :(得分:0)

我做了一些事情来绕过这个问题。奥斯卡·佩雷斯给了我这个想法。我所做的是为proyects_c(admin_id)添加了一列。完成后,这就是我使用的查询:

UPDATE proyects_c, users SET proyects_c.admin_id=users.keyid WHERE proyects_c.director=users.username;

这就是我想要的。之后我删除了director列并将admin_id重命名为director。我想要做的是将导演的类型从字符串更改为int in,并添加user.keyid中的int值,该值对应于以前在director中的名称(字符串)。所以这对我有用。奥斯卡让我意识到我想要修改的行与查询结果中的行之间的唯一关系是位置。我这样做是为了在两个不同的领域中关系是一个相等的值。谢谢你的帮助。