【发布时间】:2017-08-22 06:01:55
【问题描述】:
我想检查两个不同的表中是否存在相同的两个属性值。如果 table_a 中的组合在 table_b 中不存在,则应将其插入到 select 语句表中。现在我有以下查询,它正在工作:
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)
但是,执行时间相当长。所以我想问一下是否有更快的解决方案来检查。
【问题讨论】:
-
与性能无关,但
(table_a.attr_a, table_a.attr_b) != all (select table_b.attr_a, table_b.attr_b ..)会更正确。这可以利用(attr_a, attr_b)上的索引。查看where not exists查询是否更快。 -
请Edit您的问题并为有问题的表(包括所有索引)添加
create table语句以及使用explain (analyze, verbose)生成的执行计划。 Formatted text 请no screen shots
标签: sql postgresql select