[21000][1242]子查询returns多于1行
[21000][1242] Subquery returns more than 1 row
我的查询:
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] 子查询 returns 多于 1 行
通过异常的方法,我确定了这个查询字符串中的错误:
"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "
如何正确的请求才不会出现这个错误?谢谢!
子查询 returns 多于 1 行 ,这仅仅意味着您的查询没有返回任何行以使外部 select 语句起作用。
"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "
您必须应用一组条件来唯一地过滤出您的数据,或者使用联接来组合您的 table 答案和问题,然后相应地过滤数据。
您还可以通过 GROUP_CONCAT Mysql 函数将每一行数据分组到一列中,如下所示:
"(SELECT GROUP_CONCAT(a.isHelpful) FROM Answer a WHERE a.question.id = q.id) "
尽管 GROUP_CONCAT 在 Mysql 中不可用,为此您还可以按照此 post.
中所述在休眠中绑定 SQL 函数
聚合和限制两种常见方式:
(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)
但是,这些实际上只是用来绕过 "issue" 数据的技巧。我把问题放在引号中,但真正的问题可能是你对数据的理解,而不是数据本身。
你应该明白为什么会有重复了。然后决定你想要哪个值。并根据您的需要实施正确的逻辑。
经过一天的各种尝试和错误,我找到了以下解决方案,希望有人开阔眼界,帮助解决他们的问题:
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")
我的查询:
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] 子查询 returns 多于 1 行
通过异常的方法,我确定了这个查询字符串中的错误:
"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "
如何正确的请求才不会出现这个错误?谢谢!
子查询 returns 多于 1 行 ,这仅仅意味着您的查询没有返回任何行以使外部 select 语句起作用。
"(SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id) "
您必须应用一组条件来唯一地过滤出您的数据,或者使用联接来组合您的 table 答案和问题,然后相应地过滤数据。
您还可以通过 GROUP_CONCAT Mysql 函数将每一行数据分组到一列中,如下所示:
"(SELECT GROUP_CONCAT(a.isHelpful) FROM Answer a WHERE a.question.id = q.id) "
尽管 GROUP_CONCAT 在 Mysql 中不可用,为此您还可以按照此 post.
中所述在休眠中绑定 SQL 函数聚合和限制两种常见方式:
(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)
但是,这些实际上只是用来绕过 "issue" 数据的技巧。我把问题放在引号中,但真正的问题可能是你对数据的理解,而不是数据本身。
你应该明白为什么会有重复了。然后决定你想要哪个值。并根据您的需要实施正确的逻辑。
经过一天的各种尝试和错误,我找到了以下解决方案,希望有人开阔眼界,帮助解决他们的问题:
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")