Как исправить запрос, построенный объединением в knex

Я использую knex с pg для получения некоторых данных из моей БД. Запрос, который я пытаюсь создать с помощью knex:

select "fixtime" from "positions" order by "fixtime" desc limit(1) 
union 
select "fixtime" from "positions" order by "fixtime" limit (1)

но knex возвращает следующий запрос, когда я использовал «союз». И я получаю ошибку, когда пытаюсь получить результат.

console.log(db.select('fixtime').from('positions').orderBy('fixtime').limit(1).union([db.select('fixtime').from('positions').orderBy('fixtime','desc').limit(1)]).toSQL())

это результат консоли:

select "fixtime" from "positions" 
union 
select "fixtime" from "positions" order by "fixtime" desc limit ? order by "fixtime" asc limit ?

db.select('fixtime').from('positions').orderBy('fixtime').limit(1).union([db.select('fixtime').from('positions').orderBy('fixtime','desc').limit(1)]).then(arr => console.log)

это ошибка, которую я получил: необработанная ошибка отклонения: синтаксическая ошибка в или около «порядка»

Когда я использовал один запрос, я могу получить результат. Как я могу исправить этот запрос с помощью knex или это ошибка?


person Fardin2689    schedule 03.08.2019    source источник


Ответы (1)


Я считаю, что это невозможно с Knex так, как вы пытаетесь это сделать. Существует проблема, описывающая нечто подобное.

Но... Вы можете обмануть свой путь к результату с помощью Postgres, используя два CTE.

const sql = db
  .with('first', qb => {
    qb.select('fixtime')
      .from('tc_positions')
      .orderBy('fixtime', 'asc')
      .limit(1);
  })
  .with('last', qb => {
    qb.select('fixtime')
      .from('tc_positions')
      .orderBy('fixtime', 'desc')
      .limit(1);
  })
  .select('*')
  .from('first')
  .union(function() {
    this.select('*').from('last');
  })
  .toSQL();

console.log(sql);

это дает:

WITH "first" AS (
    SELECT
        "fixtime"
    FROM
        "tc_positions"
    ORDER BY
        "fixtime" ASC
    LIMIT ?
),
"last" AS (
    SELECT
        "fixtime"
    FROM
        "tc_positions"
    ORDER BY
        "fixtime" DESC
    LIMIT ?
)
SELECT
    *
FROM
    "first"
UNION
SELECT
    *
FROM
    "last"
person madflow    schedule 03.08.2019