首页 > 其他分享 >数据过多时候,子查询改成left join减少笛卡尔积

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

时间:2023-12-03 14:44:39浏览次数:28  
标签:node join cn parent 笛卡尔 portal type id left

子查询

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

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

  

标签:node,join,cn,parent,笛卡尔,portal,type,id,left
From: https://www.cnblogs.com/xiaozi718/p/17872978.html

相关文章

  • Fork/Join
    Fork/Join框架简介Fork/Join框架简介Fork/Join它可以将一个大的任务拆分成多个子任务并行处理,最后将子任务结果合成并最后的计算结果,并进行输出。FOrk/Join框架要完成两件事情。Fork:把一个复杂的任务进行分析,大任务拆分成小任务;Join:把拆分的结果进行合并。1.任务分割,Fork/Join......
  • SQL Server中left join、inner join和right join的区别?
    数据库是我们IT行家常的事情,相信大家都不陌生,计算机专业都开了数据库系统概论这门课程,我分享下在暑假找实习参加宣讲会过程做的笔试题中遇到关于leftjoin、innerjoin和rightjoin的区别的简述题,希望对需要的朋友有所帮助。看下面一个小例子,我懒的开软件,用Excel替代下,谅解谅解~st......
  • oracle、sql server Join连表修改。
    1、Oracle连表修改mergeintot_usert1using(select*fromt_class)t2on(t1.userId=t2.userId)whenmatchedthenupdatesett1.name=t2.name2、Sqlserver连表修改UPDATEbSETb.ProductSN=p.productsnFROMt_userbINNERJOINt_studentpONb.MainSN=p.Ma......
  • 文件 inode 与 no space left on device 异常
    转载请注明出处:文件inode在Linux文件系统中,每一个文件或目录都会有一个inode,它是一个数据结构,用于存储文件的元数据,比如文件的权限、所有者、大小、创建和修改的时间等。inode不包含文件的实际内容,只包含文件的元数据。当你在文件系统中创建、修改或者删除文件时,实际上是在修......
  • SQL FULL OUTER JOIN 关键字:左右表中所有记录的全连接解析
    SQLRIGHTJOIN关键字SQLRIGHTJOIN关键字返回右表(table2)中的所有记录以及左表(table1)中的匹配记录。如果没有匹配,则左侧的结果为0条记录。RIGHTJOIN语法SELECTcolumn_name(s)FROMtable1RIGHTJOINtable2ONtable1.column_name=table2.column_name;注意:在某些数据库......
  • SQL FULL OUTER JOIN 关键字:左右表中所有记录的全连接解析
    SQLRIGHTJOIN关键字SQLRIGHTJOIN关键字返回右表(table2)中的所有记录以及左表(table1)中的匹配记录。如果没有匹配,则左侧的结果为0条记录。RIGHTJOIN语法SELECTcolumn_name(s)FROMtable1RIGHTJOINtable2ONtable1.column_name=table2.column_name;注意:在某些数据库......
  • SQL JOIN 子句:合并多个表中相关行的完整指南
    SQLJOINJOIN子句用于基于它们之间的相关列合并来自两个或更多表的行。让我们看一下“Orders”表的一部分选择:OrderIDCustomerIDOrderDate1030821996-09-1810309371996-09-1910310771996-09-20然后,看一下“Customers”表的一部分选择:CustomerID......
  • CaltechCS122 笔记:Assignment 2: SQL Translation and Joins
    Assignment2:SQLTranslationandJoinsTranslationandjoinPlanNode及其子类,如图所示:......
  • std::thread方法join与detach
    1、std::joinstd::join是std::thread类的成员函数之一,用于等待线程的执行完成。#include<iostream>#include<utility>#include<thread>#include<chrono>#include<atomic>voidprocess(std::stringstr_info){for(inti=0;i<500;++i)......
  • C# 实现FULL JOIN 效果
    参考:https://dotnettutorials.net/lesson/full-outer-join-in-linq/思路就是先leftjoin再rightjoin,最后unionnamespaceTest{internalclassProgram{staticvoidMain(string[]args){//创建测试数据varlistA=n......