[21000][1242] Subquery returns more than 1 row

Вот так выглядит мой запрос SQL:

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")

Методом исключений определил что ошибка вылетает на этой строке:

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

Пишет - [21000][1242] Subquery returns more than 1 row, гуглим что только можно, разные решения уже есть, но все очень индивидуально, что не так в этой строке?


Ответы (2 шт):

Автор решения: Vladimir Galkov

если вам всё равно, какое из нескольких значений, что вернёт подзапрос, использовать - можно добавить в него (SELECT a.isHelpful FROM Answer a WHERE a.question.id = q.id limit 1), если это значение можно подогнать под 1 сортировками, то order by a.isHelpful desc или не desc

возвращает подзапрос несколько значений потому что в Answer есть несколько a.question.id равных q.id и подозреваю, что вы об этом знаете, раз делаете вот это - (SELECT COUNT (a) FROM Answer a WHERE a.question.id = q.id) иначе эта вставка бессмысленна, так как если второй подзапрос должен возвращать один результат, то и этот всегда будет возвращать 1.

так же можно использовать так, чтобы понять больше (так несколько значений склеятся в одно и результат по любому будет 1, но склеен из нескольких подходящих) -

SELECT group_concat(a.isHelpful) FROM Answer a WHERE a.question.id = q.id
→ Ссылка
Автор решения: AlexMartynets

Может кому-то пригодится - я нашел такое решение, сильно голову конечно пришлось поломать, надеюсь кому-то упростит это жизнь:

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")
→ Ссылка