PL/SQL如何查询指定ID_HOUSE是否存在于所有关联外键表中
实现方案
方案1:高性能优先(推荐)
用EXISTS逻辑实现,只要任意从表命中匹配值就停止扫描,无需统计全量数据,性能远高于COUNT方案,尤其适合大表场景:
SELECT CASE WHEN EXISTS (SELECT 1 FROM Bedrooms WHERE ID_HOUSE = 455) OR EXISTS (SELECT 1 FROM Garden WHERE ID_HOUSE = 455) -- 新增其他从表时只需在此处追加 OR EXISTS 子查询即可 THEN TRUE ELSE FALSE END AS is_exist_in_subtable;
方案2:COUNT+关联表实现(你提到的思路)
适合需要同时统计关联数据量的场景,注意要加DISTINCT避免多表关联导致的行数重复膨胀,否则COUNT计数会失真:
SELECT CASE WHEN COUNT(DISTINCT h.ID_HOUSE) > 0 THEN TRUE ELSE FALSE END AS is_exist_in_subtable FROM House h LEFT JOIN Bedrooms b ON h.ID_HOUSE = b.ID_HOUSE LEFT JOIN Garden g ON h.ID_HOUSE = g.ID_HOUSE -- 新增其他从表时只需在此处追加LEFT JOIN,同时在下方WHERE条件补充对应非空判断 WHERE h.ID_HOUSE = 455 AND (b.ID_HOUSE IS NOT NULL OR g.ID_HOUSE IS NOT NULL);
注意事项
如果从表数量超过3个、单表数据量大于10万,优先选择方案1,多表关联的笛卡尔积会导致方案2的性能大幅下降。
内容的提问来源于stack exchange,提问作者David Rod
相关产品推荐
相关产品推荐

