【问题标题】:[21000][1242] Subquery returns more than 1 row[21000][1242] 子查询返回多于 1 行
【发布时间】:2020-08-28 18:08:07
【问题描述】:

我的查询:

entityManager.createQuery("SELECT " +
                "q.id, " +
                "q.title, " +
                "q.user.fullName, " +
                "q.user.reputationCount, " +
                "q.viewCount, " +
                "q.countValuable, " +
                "q.persistDateTime,  " +
                "t.id, " +
                "t.name, " +
                "t.description, " +
                "(SELECT COUNT (a) FROM Answer a WHERE a.question.id = q.id), " +
                "(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) " +
                "FROM Question q JOIN q.tags t")

这里出现错误 - [21000][1242] 子查询返回超过 1 行

通过异常的方法,我确定这个查询字符串中的错误:

"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "

如何做出正确的请求,才不会出现这个错误?谢谢!

【问题讨论】:

  • 错误的哪一部分你不明白?似乎很清楚。子查询返回多行。
  • 你看到我的问题了吗?如何提出正确的请求?
  • 查询“SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id”应修改为返回单行。可以使用 MIN,MAX,但您必须自己决定。根据您的用例添加其他过滤器以返回查询的单行。

标签: mysql sql hibernate hql


【解决方案1】:

子查询返回多于 1 行,这仅表示您的查询没有返回单行以使外部 select 语句起作用。

"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "

您必须应用一组条件来唯一地过滤掉您的数据,或者使用连接来组合您的表 Answer 和 Question,然后相应地过滤数据。

您还可以通过 GROUP_CONCAT Mysql 函数将每一行数据分组在一列中,如下所示:

"(SELECT GROUP_CONCAT(a.isHelpful) FROM Answer a WHERE a.question.id = q.id) "

虽然 GROUP_CONCAT 在 Mysql 中不可用,但您也可以在休眠中绑定 SQL 函数,如 post 中所述。

【讨论】:

    【解决方案2】:

    两种常见的方式是聚合和限制:

    (SELECT MAX(a.isHelpful) FROM Answer a WHERE a.question.id = q.id)
    (SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id LIMIT 1)
    

    但是,这些实际上只是解决数据“问题”的技巧。我将问题放在引号中,但真正的问题可能是您对数据的理解,而不是数据本身。

    你应该明白为什么会有重复。然后决定你想要的值。并为你想要的实现正确的逻辑。

    【讨论】:

    • 不幸的是,这段代码对我来说不能正常工作:(
    • 实体Answer 有isHelpful 字段,我需要从这个与问题相对应的答案中提取它,我怎样才能只得到只对应于这个问题的值?
    • 我可以不用子查询吗?
    • @AlexMartynets 。 . .这两个版本中的任何一个都将解决此问题中的错误。无法回答它是否有用,因为 this 问题是关于运行时错误(已解决)。也许您对自己真正想要完成的工作还有其他疑问。
    【解决方案3】:

    经过一天的各种尝试和错误,我找到了以下解决方案,希望有人能开阔眼界,帮助解决他们的问题:

    entityManager.createQuery("SELECT " +
                    "q.id, " +
                    "q.title, " +
                    "q.user.fullName, " +
                    "q.user.reputationCount, " +
                    "q.viewCount, " +
                    "q.countValuable, " +
                    "q.persistDateTime,  " +
                    "t.id, " +
                    "t.name, " +
                    "t.description, " +
                    "(SELECT COUNT (a) FROM Answer a WHERE a.question.id = q.id), " +
                    "(SELECT CASE WHEN MAX (a.isHelpful) > 0 THEN true ELSE false END FROM Answer a WHERE a.question.id = q.id) " +
                    "FROM Question q JOIN q.tags t")
    

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多