子查询返回多行。使用SQL select来更新不同的表结果

时间:2017-12-04 11:38:37

标签: mysql

我正在尝试更新下表中的列' jobqueue'使用在' mdtinfo'上执行的SELECT查询的结果表

我想要更新的列名为ignore,我需要将值从默认值0设置为1.

update jobqueue
set jobqueue.`ignore`= '1'
   where (SELECT JobQueue_job_queue_id
    FROM mdtinfo
    WHERE product_name  = 'Example')

上述查询返回以下错误:SQL错误(1242):子查询返回多于1行。

当运行select查询时,它会成功返回结果。

2 个答案:

答案 0 :(得分:1)

在MySQL中,WHERE子句中出现的值为零意味着错误。

因此,UPDATE something SET col=val WHERE (SELECT colx FROM sometable)有可能成为有效的查询。如果内部SELECT只获得一行,并且其colx列的值为0,则更新将不会执行任何操作。如果colx列的值非零,则查询表示UPDATE something SET col=val WHERE true。因此, sometable中的每一行都会更新。我怀疑这是你想要的。

如果内部SELECT碰巧返回多行,则查询无效。您将收到实际收到的错误1242。

(将数字解释为布尔值的业务导致MySQL接受一些其他狡猾的查询语法,如问题中的语法。)

我想您要检索实际要更新的行的job_queue_id值。所以尝试这样的事情。

update jobqueue
   set jobqueue.`ignore`= '1'
 where jobqueue.job_queue_id IN (SELECT JobQueue_job_queue_id
                                   FROM mdtinfo
                                  WHERE product_name  = 'Example')

我猜你有一个专栏jobqueue.job_queue_id。您没有告诉我们您在jobqueue中有哪些列。

答案 1 :(得分:0)

update jobqueue
set jobqueue.`ignore`= '1'
    where jobqueue.`job_queue_id` IN (SELECT GROUP_CONCAT(JobQueue_job_queue_id)
    FROM mdtinfo
    WHERE product_name  = 'Example' GROUP BY product_name)

你应该在where condition中写下列名。