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

时间:2019-07-10 08:07:00

标签: sql postgresql query-performance

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

我尝试从B和C上存在存在子句的A中选择行,然后使用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)
);

这可以优化还是有更好的方法做到这一点。

谢谢。

1 个答案:

答案 0 :(得分: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来过滤您可能想要的相关结果。 一种建议的检查是“ WHERE B.fk_1 IS NOT NULL”,以过滤掉没有FK的记录。