2017-07-13 12 views
0

テーブルaにテーブルbのサブクエリを挿入しようとしています。サブクエリ内のレコードの多くはすでにテーブルaにあります。ポストグルでこれを行う慣用的な方法は、EXCEPTクエリを使用するように思われます。しかし、私はknexサポートを見つけることができません(未加工以外)。私が逃したEXCEPTのクエリを行う方法はありますか?サブクエリに参加してWHERE NOT INを実行することができますが、それはかなり遅くなる可能性が高いとわかります。knex.jsのクエリ

答えて

1

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

通常、postgresqlはnot in (subquery)exceptと同じに最適化します。

あなたがそれを使用したい場合は、あなたが実際のような何かをする必要があるのでKnexは、EXCEPTクエリのための特別なサポートを持っていない:

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

パフォーマンスの違いを心配している場合は、私がしようとお勧めしますクエリを実行する両方の方法(EXPLAINクエリ)についてクエリプランをチェックし、内部的にそれらを実行する方法に違いがあるかどうかを確認してください。

関連する問題