2017-08-22 13 views
0

同じ2つの属性値が2つの異なるテーブルに存在するかどうかをチェックしたいと思います。 table_aの組み合わせがtable_bに存在しない場合は、select文テーブルに挿入する必要があります。今私は、動作している次のクエリを持っています:postgres属性の組み合わせが他のテーブルにも存在するかどうかを確認する

CREATE TABLE table_a (
attr_a integer, 
attr_b text, 
uuid character varying(200), 
CONSTRAINT table_a_pkey PRIMARY KEY (uuid) 
); 

CREATE TABLE table_b (
attr_a integer, 
attr_b text, 
uuid character varying(200), 
CONSTRAINT table_b_pkey PRIMARY KEY (uuid) 
); 


SELECT * FROM table_a 
     WHERE (table_a.attr_a::text || table_a.attr_b::text) != ALL(SELECT (table_b.attr_a::text || table_b.attr_a::text) FROM table_b) 

しかし、実行時間はかなり長いです。だから私はそれを確認するより速い解決策があるかどうか尋ねたいと思う。

+0

ないパフォーマンス関連のが、 '(table_a.attr_a、table_a.attr_b)!=全て(table_b.attr_a、table_b.attr_bを選択するには...)'より正確だろう。そしてそれは '(attr_a、attr_b)'のインデックスを利用することができます。 '存在しない'クエリがより速いかどうかを見てください。 –

+0

**あなたの質問を**編集して**問題のテーブル(すべてのインデックスを含む)と** explain(analyze、verbose)を使用して生成された実行プランに 'create table'ステートメントを追加してください**。 [**フォーマットされたテキスト**](http://stackoverflow.com/help/formatting)、[スクリーンショットなし](http://meta.stackoverflow.com/questions/285551/why-may-i-not -upload-images-of-code-on-so-asking-a-question/285557#285557) –

答えて

1

where句は、attr_a(テキストにキャストし、attr_bとconcatinating)の操作を使用するため、インデックスは使用できません。この連結の代わりに、直接existsオペレータをお試しください。

SELECT * 
FROM table_a a 
WHERE NOT EXISTS (SELECT * 
        FROM table_b b 
        WHERE a.attr_a = b.attr_a AND 
          b.attr_b = b.attr_b) 
関連する問題