Postgres中判断同表不同列值是否存在匹配的更优方法?
无需副表的最优实现方式
你完全不需要创建副表fTable2,直接通过自关联查询就能实现需求,之前直接比较未得到结果,大概率是因为没有给表设置别名,导致数据库无法区分主查询和子查询中的同一张表。
推荐实现方式(EXISTS子查询)
SELECT * FROM db."fTable1" t1 WHERE EXISTS ( SELECT 1 -- 用SELECT 1比SELECT *性能略优,无需返回全字段 FROM db."fTable1" t2 WHERE t2."idParent" = t1."idWit" );
这里给表设置了两个别名t1和t2:
t1代表主查询中当前要判断的行t2用来在同一张表中检索是否存在另一行的idParent等于t1的idWit
替代实现方式(IN子查询)
如果逻辑更直观,也可以用IN子查询:
SELECT * FROM db."fTable1" WHERE "idWit" IN ( SELECT "idParent" FROM db."fTable1" WHERE "idParent" IS NOT NULL -- 可选,过滤空值减少检索量 );
性能优化建议
如果这类查询比较频繁,建议给idParent和idWit字段创建索引,大幅提升查询速度:
CREATE INDEX idx_ftable1_idparent ON db."fTable1"("idParent"); CREATE INDEX idx_ftable1_idwit ON db."fTable1"("idWit");
内容的提问来源于stack exchange,提问作者Sabrina Sampaio Simão
相关产品推荐
相关产品推荐

