在给定现有子查询的情况下,我正在使用-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
构建查询。在GitHub中的this回答和this主题后,我尝试了以下内容:
knex.js
但结果是:
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
为什么不添加括号,如何更改?
答案 0 :(得分:2)
你的方式,你是怎么做的似乎是正确的,我会说它是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)' }
答案 1 :(得分:0)
我发现一个丑陋(但有效)的解决方案是使用knex.raw
和subQuery.toString
:
const query = knex.queryBuilder()
.select('*')
.from(knex.raw(`(${subQuery})`);
我不相信这是最好的答案,我确定我错过了什么,所以我还不接受这个答案。