如何使用子查询替代SQL语句中的VIEW完成查询?
用子查询替代视图实现相同查询
我们可以把每个视图的逻辑直接嵌套成子查询,逐步合并到最终语句里,具体实现如下:
分步替换说明
1. 先把A1视图转为子查询
原A1的作用是筛选出恰好拥有2条狗的客户ID,这部分可以写成派生表子查询,直接放到原A2语句的FROM子句中替代A1:
SELECT filial, COUNT(a1_sub.client_ID) FROM ( -- 原A1的逻辑,作为子查询 SELECT client_ID, COUNT(dog_id) FROM test_clients GROUP BY client_ID HAVING COUNT(dog_id) = 2 ) AS a1_sub JOIN test_clients USING (client_ID) GROUP BY filial HAVING COUNT(a1_sub.client_ID) > 10;
2. 再把A2的逻辑嵌套成子查询,合并到最终统计语句
上面的语句等价于原VIEW A2,我们直接把它作为子查询放到最终的统计语句里,得到完整的合并版本:
SELECT COUNT(filial) FROM ( -- 原A2的逻辑,嵌套了A1的子查询 SELECT filial, COUNT(a1_sub.client_ID) FROM ( -- 原A1的逻辑 SELECT client_ID, COUNT(dog_id) FROM test_clients GROUP BY client_ID HAVING COUNT(dog_id) = 2 ) AS a1_sub JOIN test_clients USING (client_ID) GROUP BY filial HAVING COUNT(a1_sub.client_ID) > 10 ) AS a2_sub;
可选:用CTE简化可读性(效果与子查询一致)
如果你的SQL支持公共表表达式(CTE),可以用WITH子句让逻辑更清晰:
WITH a1_sub AS ( SELECT client_ID, COUNT(dog_id) FROM test_clients GROUP BY client_ID HAVING COUNT(dog_id) = 2 ), a2_sub AS ( SELECT filial, COUNT(a1_sub.client_ID) FROM a1_sub JOIN test_clients USING (client_ID) GROUP BY filial HAVING COUNT(a1_sub.client_ID) > 10 ) SELECT COUNT(filial) FROM a2_sub;
每个子查询/CTE的逻辑都和原视图完全对应:
a1_sub等价于原VIEW A1,筛选出有2条狗的客户a2_sub等价于原VIEW A2,关联原表统计每个filial下符合条件的客户数大于10的记录- 外层语句统计符合要求的filial数量
内容的提问来源于stack exchange,提问作者Andrey Baev
相关产品推荐
相关产品推荐

