【问题标题】:Subquery returns more than 1 row solution for update query using select statement子查询使用select语句返回多于1行的更新查询解决方案
【发布时间】:2014-08-14 17:34:04
【问题描述】:

您好,我有一个查询,其中我使用 select 语句编写了更新语句。但不幸的是,得到错误子查询返回超过 1 行。我知道错误在哪里。但我不知道相同的解决方案。谢谢。 这是查询:

UPDATE adsetest.dashboard_widget_users
SET configuration=
  (SELECT DISTINCT ad_news_texte.headline
   FROM autodo.ad_news_texte
   INNER JOIN autodo.ad_news_oe
     ON ad_news_texte.news_id = ad_news_oe.id_ad_news
   INNER JOIN autodo.ad_news
     ON ad_news_oe.id_ad_news = ad_news.id
   WHERE ad_news.datum_archiv BETWEEN
     curdate() - INTERVAL DAYOFWEEK(curdate()) + 28 DAY AND curdate())
WHERE dsnr_yw_user = 1 AND dsnr_dashboard_widget = 1

【问题讨论】:

  • 您始终可以在子查询中使用LIMIT 1 以避免错误,但您需要修复子查询以仅返回您想要的行。

标签: mysql sql sql-update subquery


【解决方案1】:

你必须首先考虑你想做什么。

您想获取一个值并将其保存在其他地方吗? 然后使用 SET 值 = (SELECT...)。为此,您需要确保内部语句不会返回多个值。

或者

您是否需要能够处理获取多个值? 你想用这些做什么?全部保存?多合一(使用 concat)还是单独存储(每个结果一个更新)?还是选择其中之一?可能是第一个 (LIMIT 1) 或最高 (MAX) 或最低 (MIN) 值?

【讨论】:

    【解决方案2】:

    当您对SET configuration=(SELECT ...) 使用更新时,子查询必须返回不超过一个值(一行)。如果它返回多个值,例如如何将两行表分配给标量 configuration 字段。因此,您应该弄清楚为什么您的子查询返回多行并修复子查询或决定在多行的情况下选择哪个 ONE 值进行更新。例如你可以选择最大值

    SELECT MAX(ad_news_texte.headline)...
    

    或任何一个第一个值

    (SELECT ad_news_texte.headline)... LIMIT 1)
    

    等等……

    如果您需要将所有行连接起来并放入一行configureation,您可以使用GROUP_CONCAT() mysql 函数:

    SET configuration=(SELECT GROUP_CONCAT(DISTINCT ad_news_texte.headline) FROM ....
    

    【讨论】:

    • 如果我使用限制 1 它正在运行但如果我想更新多行怎么办?
    • @user3702602 那么您应该编辑您的问题并添加数据示例以及更新后您希望获得的输出。目前尚不清楚您想要实现什么。
    • 您可以更新多行。子查询的结果将用于更新每一行。如果子查询依赖于被更新的行,那么它将在每行被更新时执行一次。
    • @valex 我有问题抱歉?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2013-08-18
    相关资源
    最近更新 更多