[英]Select from an existing query in knex.js
給定現有子查詢,我正在使用knex.js
構建查詢。 按照這個答案以及GitHub中的這個線程,我嘗試了以下操作:
const knex = require("knex")({client: 'pg'});
const subQuery = knex.queryBuilder().select(1);
const query = knex.queryBuilder().select('*').from(subQuery);
console.log(query.toString());
但是結果是:
select * from select 1
顯然有語法錯誤。 我的預期結果是:
select * from (select 1)
為什么不加括號,如何更改?
您的方式,您的做法似乎是正確的,我會說這是knex
錯誤,為什么它不起作用(我是knex
中的knex
)。
無論如何,有幾種方法可以做到...
const knex = require("knex")({client: 'pg'});
const subQuery = knex.select(1).as('t1');
const query = knex.select('*').from(subQuery);
console.log(query.toSQL());
{ method: 'select',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [],
__knexQueryUid: '69d240ad-f5f8-4bc4-8c1d-fb9432af1da2',
sql: 'select * from (select 1) as "t1"' }
或者,您可以將舊樣式與function()
子查詢一起使用,該子查詢不需要.as()
,但可以支持它。
const query = knex.select('*').from(sq => sq.select(1));
console.log(query.toSQL());
{ method: 'select',
options: {},
timeout: false,
cancelOnTimeout: false,
bindings: [],
__knexQueryUid: '31beb080-c89a-43b2-b112-546077330e82',
sql: 'select * from (select 1)' }
我發現一個難看(但knex.raw
)的解決方案是使用knex.raw
和subQuery.toString
:
const query = knex.queryBuilder()
.select('*')
.from(knex.raw(`(${subQuery})`);
我不認為這是最好的答案,而且我確定我錯過了一些東西,所以我還不接受這個答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.