我想在 knex
中编写此查询。
该查询从 students_subject
(students
和 subjects
的联合表)中获取所有注册了所有这些科目 ID ['123', '456', '789']
的学生 ID。
PSQL:
select student_id from students_subject
group by id
having ARRAY_AGG(subject_id) @> array[
'123'::uuid,
'456'::uuid,
'789'::uuid
];
我在knex
中尝试过类似的操作,其中subject_ids
是主题ID
的数组
。 queryBuilder
是传递给该函数的 knex
实例,该实例将被返回。
Javascript函数:(返回knex查询)
const knex = require('../../../db/knex');
const getSudents = function( queryBuilder, subject_ids) {
return queryBuilder.innerJoin('students_subject',
'students_subject.student_id',
'students.id')
.groupBy('students_subject.student_id')
.having(knex.raw('ARRAY_AGG(students_subject.subject_id) @> UNNEST(ARRAY[?]::uuid[])', [subject_ids]));
}
module.exports = getSudents;
-
传递的
queryBuilder
背后有其他逻辑,我不允许修改它。我的工作是构建查询
来获取学生ids
并通过。我收到的错误是:
error: set-returning functions are not allowed in HAVING
你能帮我编写正确的knex
查询吗?
最佳答案
由于各种原因,Knex 无法知道如何将 JavaScript 数组展平为查询。所以你需要手动压平它:
...UNNEST(ARRAY[${subject_ids.map(() => '?').join(',')}]::uuid[])`, subject_ids));
关于javascript - 克尼克斯 : How to write ARRAY_AGG in having clause in knex?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59162752/