All Downloads are FREE. Search and download functionalities are using the official Maven repository.

settings.sqls.GlobalRecursive.xml Maven / Gradle / Ivy

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//qdbp.gitee.io//DTD QdbcMapper 1.1//EN" "https://qdbp.gitee.io/dtd/qdbc/qdbc.mapper.1.0.dtd">
<mapper namespace="GlobalRecursive">
	<!--
	标准递归语法都差不多
	前缀关键字有所不同: MySQL8,PostgreSQL,SQLite的是WITH RECURSIVE; DB2,SqlServer的是WITH
	实测发现DB2与MySQL相比有一些差异:
	    不支持_开头的字段名, 于是将_temp_parent_改为temp_parent
	    不支持field AS alias, 于是去掉AS改成field alias
	    WITH AS中不支持INNER JOIN, 于是改成 A, B WHERE A.PARENT=B.temp_parent
	-->

	<import>com.gitee.qdbp.tools.utils.ConvertTools</import>

	<!-- 递归查询所有子节点, 标准递归语法 -->
	<select id="recursiveListChildrenQuery:normal">
		<supports>mysql.8,mariadb.10.2.2,postgresql,db2,h2,sqlserver,sqlite.3.8.3</supports>
		<config key="recursive.keyword"/> recursive_temp_table(temp_parent) AS (
		    SELECT ${codeColumn} temp_parent FROM ${tableName} 
		    	WHERE <sql-in column="${codeColumn}" value="${startCodes}" />
				<append prefix="AND">#{filterWhere}</append>
		    UNION ALL
		    SELECT ${codeColumn} FROM ${tableName} A, recursive_temp_table B
		    	WHERE A.${parentColumn}=B.temp_parent
				<append prefix="AND">#{filterWhere}</append>
		)
		SELECT ${selectColumns}
			FROM ${tableName} 
		WHERE ${codeColumn} IN ( SELECT temp_parent FROM recursive_temp_table )
			<append prefix="AND">#{searchWhere}</append>
		<append prefix="ORDER BY">#{orderBy}</append>
	</select>


	<!-- 递归查询所有子节点, mysql专用递归语法 -->
	<!-- 可能需要调整GROUP_CONCAT的长度: group_concat_max_len = 40960 -->
	<!-- SELECT DISTINCT ${selectColumns} 会报错 ORDER BY clause is not in SELECT list -->
	<select id="recursiveListChildrenQuery:mysql">
		SELECT ${selectColumns} FROM (
			SELECT T.ID__LIST FROM (
				SELECT  @IDS AS ID__LIST, (
					SELECT @IDS := GROUP_CONCAT( ${codeColumn} ) 
					FROM ${tableName} 
					WHERE FIND_IN_SET( ${parentColumn}, @IDS ) 
						<append prefix="AND">#{filterWhere}</append>
				) AS PID 
				FROM ${tableName}, ( SELECT @IDS := #{@ConvertTools.joinToString(startCodes)} ) T
					<append prefix="WHERE">#{filterWhere}</append>
			) T 
			WHERE T.ID__LIST IS NOT NULL
		) T1, ${tableName} T2 
		WHERE FIND_IN_SET( T2.${codeColumn}, T1.ID__LIST )
			<append prefix="AND">#{searchWhere}</append>
		<append prefix="ORDER BY">#{orderBy}</append>
	</select>


	<!-- 递归查询所有子节点, oracle专用递归语法 -->
	<select id="recursiveListChildrenQuery:oracle">
		SELECT DISTINCT ${selectColumns} FROM (
			SELECT * FROM ${tableName}
			<append prefix="WHERE">#{filterWhere}</append>
			START WITH <sql-in column="${codeColumn}" value="${startCodes}" />
				CONNECT BY PRIOR ${codeColumn}=${parentColumn}
				<append prefix="ORDER BY">#{orderBy}</append>
		)
		<append prefix="WHERE">#{searchWhere}</append>
	</select>


	<!-- 递归查询所有子节点, 使用存储过程实现的递归查询 -->
	<!-- MySQL存储过程有临时表, 可能需要设置: enforce_gtid_consistency = off -->
	<select id="recursiveListChildrenQuery">
		CALL RECURSIVE_LIST_CHILDREN_QUERY (
		    "${tableName}",
		    "${startCodes}",
		    "${codeColumn}",
		    "${parentColumn}",
		    "${selectColumns}",
		    "${filterWhere}",
		    "${searchWhere}",
		    "${orderBy}"
		);
	</select>


	<!-- 递归查询所有父节点, 标准递归语法 -->
	<select id="recursiveListParentsQuery:normal">
		<supports>mysql.8,mariadb.10.2.2,postgresql,db2,h2,sqlserver,sqlite.3.8.3</supports>
		<config key="recursive.keyword"/> recursive_temp_table(temp_parent) AS (
		    SELECT ${codeColumn} temp_parent FROM ${tableName} 
		    	WHERE <sql-in column="${codeColumn}" value="${startCodes}" />
				<append prefix="AND">#{filterWhere}</append>
		    UNION ALL
		    SELECT ${parentColumn} FROM ${tableName} A, recursive_temp_table B
		    	WHERE B.temp_parent=A.${codeColumn}
				<append prefix="AND">#{filterWhere}</append>
		)
		SELECT ${selectColumns}
			FROM ${tableName} 
		WHERE ${codeColumn} IN ( SELECT temp_parent FROM recursive_temp_table )
			<append prefix="AND">#{searchWhere}</append>
		<append prefix="ORDER BY">#{orderBy}</append>
	</select>


	<!-- 递归查询所有父节点, mysql专用递归语法 -->
	<!-- 可能需要调整GROUP_CONCAT的长度: group_concat_max_len = 40960 -->
	<select id="recursiveListParentsQuery:mysql">
		SELECT ${selectColumns} FROM (
			SELECT T.ID__LIST FROM (
				SELECT @IDS AS ID__LIST, (
					SELECT @IDS := GROUP_CONCAT(${parentColumn})
					FROM ${tableName} 
					WHERE FIND_IN_SET( ${codeColumn}, @IDS )
						<append prefix="AND">#{filterWhere}</append>
				) AS PID
				FROM ${tableName}, ( SELECT @IDS := #{@ConvertTools.joinToString(startCodes)} ) T
					<append prefix="WHERE">#{filterWhere}</append>
			) T
			WHERE T.ID__LIST IS NOT NULL
		) T1, ${tableName} T2 
		WHERE FIND_IN_SET( T2.${codeColumn}, T1.ID__LIST )
			<append prefix="AND">#{searchWhere}</append>
		<append prefix="ORDER BY">#{orderBy}</append>
	</select>


	<!-- 递归查询所有父节点, oracle专用递归语法 -->
	<select id="recursiveListParentsQuery:oracle">
		SELECT DISTINCT ${selectColumns} FROM (
			SELECT * FROM ${tableName}
			<append prefix="WHERE">#{filterWhere}</append>
			START WITH <sql-in column="${codeColumn}" value="${startCodes}" />
				CONNECT BY PRIOR ${parentColumn}=${codeColumn}
				<append prefix="ORDER BY">#{orderBy}</append>
		)
		<append prefix="WHERE">#{searchWhere}</append>
	</select>


	<!-- 递归查询所有父节点, 使用存储过程实现的递归查询 -->
	<!-- MySQL存储过程有临时表, 可能需要设置: enforce_gtid_consistency = off -->
	<select id="recursiveListParentsQuery">
		CALL RECURSIVE_LIST_PARENTS_QUERY (
		    "${tableName}",
		    "${startCodes}",
		    "${codeColumn}",
		    "${parentColumn}",
		    "${selectColumns}",
		    "${filterWhere}",
		    "${searchWhere}",
		    "${orderBy}"
		);
	</select>
</mapper>




© 2015 - 2025 Weber Informatics LLC | Privacy Policy