数据过多时候,子查询改成left join减少笛卡尔积

子查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
    cn.portal_id AS portalId,
    count( id ) AS num
FROM
    construction_package_wbs_node cn
WHERE
    cn.delete_flag = 0
    AND (
        cn.node_type = '单位工程'
        OR cn.node_type = '分部工程'
        OR cn.node_type = '分项工程'
        OR cn.node_type = '单元工程'
        OR cn.node_type = '子检验批'
        OR cn.node_type = '检验批'
    )
    AND id NOT IN ( SELECT ref_parent_id FROM construction_package_wbs_node WHERE delete_flag = 0 AND node_type = '子检验批' )
GROUP BY
    cn.portal_id

  当construction_package_wbs_node 这张表数据条数如果多大,笛卡尔积就会更大,所以查询非常慢可能存在运行不出来,改成如下方式就会非常快,并且不止查一种门户的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT
    cn.portal_id AS portalId,
    count( id ) AS num
FROM
    construction_package_wbs_node cn
    LEFT JOIN ( SELECT ref_parent_id, portal_id FROM construction_package_wbs_node WHERE delete_flag = 0 AND node_type = '子检验批' GROUP BY portal_id, ref_parent_id ) sq ON cn.id = sq.ref_parent_id
    AND cn.portal_id = sq.portal_id
WHERE
    cn.delete_flag = 0
    AND (
        cn.node_type = '单位工程'
        OR cn.node_type = '分部工程'
        OR cn.node_type = '分项工程'
        OR cn.node_type = '单元工程'
        OR cn.node_type = '子检验批'
        OR cn.node_type = '检验批'
    )
    AND sq.ref_parent_id IS NULL
GROUP BY
    cn.portal_id

  

posted @   nitianxiaozi  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示