我想检查两个不同的表中是否存在相同的两个属性值。如果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)
但是,执行时间很长。所以我想问一下是否有更快的解决方案来检查。
答案 0 :(得分:1)
您的where
子句使用attr_a
的操作(将其转换为文本并与attr_b
结合),因此无法使用索引。而不是这种连接,为什么不尝试一个直接的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)