knex.js 中的查询除外
except query in knex.js
我正在尝试将 table b 上的子查询插入到 table a 中。子查询中的许多记录将已经在 table 中。在 postgres 中执行此操作的惯用方法似乎是使用 EXCEPT
查询。但是,我找不到 knex 对此的支持(原始除外)。有没有办法做我错过的 EXCEPT
查询?我知道我可以在子查询中加入 a 并执行 WHERE NOT IN
,但这似乎要慢得多。
通常 postgresql 会优化您的 not in (subquery)
与 except
语句相等。
Knex 对EXCEPT
查询没有任何特殊支持,所以如果你喜欢使用它,那么你确实需要做这样的事情:
knex.raw(`? EXCEPT ?`, [query1, query2])
如果您担心性能差异,我建议尝试检查两种查询方式(解释查询)的查询计划,看看 pg 内部执行它们的方式是否有任何差异。
据我所知,在 postgres 中检查 existence 的最快方法是 where exists/not exists
。
这可以通过 knex
轻松完成
const knex = require('knex')({ client: 'pg' })
const builder = knex('table_name')
.insert((sub) => {
sub.select('*').from('another_table').whereNotExists((existsBuilder) => {
existsBuilder
.select('*')
.from('table_name')
.whereRaw('table_name.id = another_table.id')
})
})
console.log(builder.toString())
// => insert into "table_name" select * from "another_table" where not exists (select * from "table_name" where table_name.id = another_table.id)
我正在尝试将 table b 上的子查询插入到 table a 中。子查询中的许多记录将已经在 table 中。在 postgres 中执行此操作的惯用方法似乎是使用 EXCEPT
查询。但是,我找不到 knex 对此的支持(原始除外)。有没有办法做我错过的 EXCEPT
查询?我知道我可以在子查询中加入 a 并执行 WHERE NOT IN
,但这似乎要慢得多。
通常 postgresql 会优化您的 not in (subquery)
与 except
语句相等。
Knex 对EXCEPT
查询没有任何特殊支持,所以如果你喜欢使用它,那么你确实需要做这样的事情:
knex.raw(`? EXCEPT ?`, [query1, query2])
如果您担心性能差异,我建议尝试检查两种查询方式(解释查询)的查询计划,看看 pg 内部执行它们的方式是否有任何差异。
据我所知,在 postgres 中检查 existence 的最快方法是 where exists/not exists
。
这可以通过 knex
const knex = require('knex')({ client: 'pg' })
const builder = knex('table_name')
.insert((sub) => {
sub.select('*').from('another_table').whereNotExists((existsBuilder) => {
existsBuilder
.select('*')
.from('table_name')
.whereRaw('table_name.id = another_table.id')
})
})
console.log(builder.toString())
// => insert into "table_name" select * from "another_table" where not exists (select * from "table_name" where table_name.id = another_table.id)