我有一个主表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)
);
这可以优化还是有更好的方法做到这一点。
谢谢。
答案 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的记录。