javascript - 克尼克斯 : How to write ARRAY_AGG in having clause in knex?

标签 javascript sql node.js postgresql knex.js

我想在 knex 中编写此查询。

该查询从 students_subject(studentssubjects 的联合表)中获取所有注册了所有这些科目 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;
    传递的
  1. queryBuilder 背后有其他逻辑,我不允许修改它。我的工作是构建查询来获取学生ids并通过。

  2. 我收到的错误是:

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/

相关文章:

javascript - 为什么手动设置时间与当前时间不同

javascript - jquery将一个对象动画到页面的顶层

java - 如何将 java 循环与 SQL 条件选择混合

javascript - 调试属于 Dotnet 的 React Web 应用程序

javascript - 将命令的响应传输到 Node

javascript - Nodejs Fstream 在管道传输多个文件时触发多个 'end' 回调

mysql - 如何重写查询以使其更快且符合 SQL 标准

java - Postgresql通知和监听

javascript - 解释 Redux 语法

Javascript 将 Date() 转换为 YYYY-MM-DD HH :MM:SS