除了在knex.js中查询

时间:2017-07-13 13:12:44

标签: postgresql knex.js

我正在尝试将表b上的子查询插入表a中。子查询中的许多记录已经在表a中。在postgres中执行此操作的惯用方法似乎是使用EXCEPT查询。但是,我找不到knex支持(除了raw)。有没有办法进行我错过的EXCEPT次查询?我知道我可以在子查询中加入WHERE NOT IN,但这看起来可能要慢得多。

2 个答案:

答案 0 :(得分:3)

据我所知,检查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)

答案 1 :(得分:1)

通常,postgresql会优化您的not in (subquery)except语句相同。

Knex对EXCEPT查询没有任何特殊支持,所以如果您想使用它,那么您确实需要执行以下操作:

knex.raw(`? EXCEPT ?`, [query1, query2])

如果您担心性能差异,我建议您尝试检查两种查询方式(EXPLAIN查询)的查询计划,并查看pg内部执行它们的方式是否存在差异。