【问题标题】:Error Code 1242: Subquery retuens more than 1 row错误代码 1242:子查询返回多于 1 行
【发布时间】:2018-06-04 09:27:42
【问题描述】:

我正在处理更新声明,但我不断收到此错误。任何人都对如何修复它有任何建议。在过去的一个小时里,我尝试从类似问题中寻找解决方案,但似乎无法让它们发挥作用。这是我的sql语句:

UPDATE T_SUBSCRIBERS 
SET FULLNAME=
(SELECT CONCAT (T_REGISTERED_FNAME, T_REGISTERED_LNAME) FROM T_REGISTERED WHERE 
T_REGISTERED_UID = T_SUBSCRIBERS.T_SUBSCRIBERS_UID);

【问题讨论】:

  • 好吧,正如错误消息明确指出的那样,您的子查询返回多于 1 行。我们无法告诉您哪些行是正确的,因为我们不知道您的数据。
  • 似乎您有几行符合条件。如何选择?
  • @Vipul,= 是分配,而不是比较。
  • 分析子查询的输出数据,找出应该更新到目标表的值,或者您可能缺少要添加的其他条件。

标签: mysql sql sql-update subquery


【解决方案1】:

** 像这样更新你的 sql:**

 UPDATE T_SUBSCRIBERS 
SET FULLNAME=
(SELECT CONCAT (T_REGISTERED_FNAME, T_REGISTERED_LNAME) FROM T_REGISTERED WHERE 
T_REGISTERED_UID = T_SUBSCRIBERS.T_SUBSCRIBERS_UID AND ROWNUM = 1);

【讨论】:

    【解决方案2】:

    符合条件的行数比您预期的要多。

    您可以通过以下方式找到违规行:

    select T_REGISTERED_UID, count(*)
    from T_REGISTERED
    group by T_REGISTERED_UID
    having count(*) > 1;
    

    如果您只是想要一个快速而简单的解决方案,请使用limit

    UPDATE T_SUBSCRIBERS s
        SET FULLNAME = (SELECT CONCAT(T_REGISTERED_FNAME, T_REGISTERED_LNAME) 
                        FROM T_REGISTERED r 
                        WHERE r.T_REGISTERED_UID = s.T_SUBSCRIBERS_UID
                        LIMIT 1
                       );
    

    不过,一般来说,最好不要在不同的表中重复这样的列值。如果您想要全名,只需加入T_REGISTERED。毕竟,如果用户更新他们的注册名称会发生​​什么?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2016-07-13
      • 1970-01-01
      相关资源
      最近更新 更多