PostgreSQL查询以检查一行是否从多个表中引用

PostgreSQL查询以检查一行是否从多个表中引用,sql,postgresql,query-performance,Sql,Postgresql,Query Performance,我有一个主表A和两个不同的子表(B,C),它们由表A中的外键引用,我想检查表B或表C中是否存在外键为fk-1的行 我尝试从B&C上的with exists子句中选择行,这些行是使用fk-1进一步选择的,或者一起选择,并找到了结果 SELECT A.id FROM A where A.id = fk-1 AND ( EXISTS (select B.id from B where B.fk_1 = fk-1) OR EXISTS (select C.id from C where

我有一个主表A和两个不同的子表(B,C),它们由表A中的外键引用,我想检查表B或表C中是否存在外键为fk-1的行

我尝试从B&C上的with exists子句中选择行,这些行是使用fk-1进一步选择的,或者一起选择,并找到了结果

SELECT A.id FROM A where A.id = fk-1 AND
(
    EXISTS (select B.id from B where B.fk_1 = fk-1)
    OR EXISTS (select C.id from C where C.fk_1 = fk-1)
);

是否可以对此进行优化,或者是否有更好的方法来实现这一点


提前感谢。

对于索引了a.id、B.fk_1和C.fk_1的单个检查,这是最快的

一个常见的陷阱是对您可能要检查的每一行调用此SQL。如果同时检查所有行,检查速度会快得多。(每行检查速度更快)

因此,如果您想同时检查一组,您可以执行以下操作:

SELECT A.id FROM A WHERE A.id IN (
    SELECT B.fk_1 FROM B [WHERE xxx] 
    UNION SELECT C.fk_1 FROM C [WHERE xxx])
使用[WHERE xxx]放置一个位置,用于筛选可能需要的相关结果。
一个推荐的检查方法是“WHERE B.fk_1 NOT NULL”,以过滤掉没有fk的记录。

我认为没有更有效(或更简单)的方法。嗨,当需要在exists子句中添加更多表时,多次使用或会对性能产生什么影响?列被索引,这是为了一次检查。感谢您提供了有关如何检查一组数据的指针。
一个常见的陷阱是为您可能要检查的每一行调用此SQL。
错误。(你从哪里知道的?)这取决于实际的SQL及其计划方式,但在一般情况下是正确的:扫描B树索引中的许多项所需的时间要比每次开始扫描所需的时间少得多。而且,不要忘记,对于每一个SQL,您必须为往返、解析时间和计划时间支付罚金。因此,除非1行版本比多行版本有更好的计划,否则多行版本会更快(以我的经验,这是95%的时间)。