2026/4/18 7:31:04
网站建设
项目流程
农业建设信息网站,百度推广开户联系方式,公司建立网站青岛电话,wordpress建英文WITH TableData AS 使用的是 CTE#xff08;Common Table Expressions#xff0c;公共表表达式#xff09; 语法#xff0c;也称为子查询因子化或WITH子句。这是SQL标准的一部分#xff0c;在很多主流数据库中都支持。1. CTE基本语法WITH cte_nam…WITH TableData AS使用的是CTECommon Table Expressions公共表表达式语法也称为子查询因子化或WITH子句。这是SQL标准的一部分在很多主流数据库中都支持。1. CTE基本语法WITH cte_name (column1, column2, ...) AS ( -- 子查询定义 SELECT ... ) -- 主查询 SELECT * FROM cte_name;2. 你的查询中CTE的结构WITH TableData AS ( -- 第一个CTE获取表的基本信息和字段信息 SELECT ... ), PrimaryKeys AS ( -- 第二个CTE获取主键信息可以定义多个CTE SELECT ... ) -- 主查询可以使用上面定义的所有CTE SELECT ... FROM ...3. CTE的主要特点优点可读性好将复杂查询分解为多个逻辑部分可重用在主查询中可以多次引用同一个CTE支持递归实现递归查询如树形结构查询在你的查询中的应用-- 第一部分定义TableData CTE WITH TableData AS ( SELECT t.TABLE_NAME, tc.COMMENTS, c.COLUMN_NAME, ... FROM DBA_TABLES t JOIN ... -- 复杂的多表连接和计算 ), -- 第二部分定义PrimaryKeys CTE虽然你定义了但后面没使用 PrimaryKeys AS ( SELECT ... ) -- 第三部分主查询基于TableData进行进一步处理 SELECT ... FROM ( -- 使用UNION ALL组合多种类型的数据行 SELECT 0 AS GROUP_ID, ... FROM TableData UNION ALL SELECT 1 AS GROUP_ID, ... FROM TableData UNION ALL SELECT 2 AS GROUP_ID, ... FROM TableData UNION ALL SELECT 3 AS GROUP_ID, ... FROM TableData ) Combined ORDER BY ...;4. 等价的传统写法不使用CTE-- 不使用CTE需要嵌套子查询 SELECT CASE WHEN GROUP_ID 0 THEN 【表】 || TABLE_NAME || ... ELSE END AS 表信息, ... FROM ( -- 表头行 SELECT 0 AS GROUP_ID, TABLE_NAME, TABLE_COMMENT, ... FROM ( -- 重复TableData的逻辑 SELECT DISTINCT t.TABLE_NAME, tc.COMMENTS AS TABLE_COMMENT FROM DBA_TABLES t LEFT JOIN DBA_TAB_COMMENTS tc ON ... LEFT JOIN DBA_TAB_COLUMNS c ON ... WHERE t.OWNER CIRCLE ) distinct_tables UNION ALL -- 字段标题行也需要重复TableData的逻辑 SELECT 1 AS GROUP_ID, TABLE_NAME, TABLE_COMMENT, ... FROM ( SELECT DISTINCT t.TABLE_NAME, tc.COMMENTS AS TABLE_COMMENT FROM DBA_TABLES t LEFT JOIN DBA_TAB_COMMENTS tc ON ... LEFT JOIN DBA_TAB_COLUMNS c ON ... WHERE t.OWNER CIRCLE ) distinct_tables UNION ALL -- 字段数据行完整重复TableData逻辑 SELECT 2 AS GROUP_ID, TABLE_NAME, TABLE_COMMENT, COLUMN_NAME, DATA_TYPE, ... FROM ( -- 这是TableData的完整内容需要在这里重复写一遍 SELECT t.TABLE_NAME, tc.COMMENTS AS TABLE_COMMENT, c.COLUMN_NAME, c.DATA_TYPE, ... FROM DBA_TABLES t LEFT JOIN DBA_TAB_COMMENTS tc ON ... LEFT JOIN DBA_TAB_COLUMNS c ON ... LEFT JOIN DBA_COL_COMMENTS cc ON ... WHERE t.OWNER CIRCLE ) table_data UNION ALL -- 空行分隔也需要重复 SELECT 3 AS GROUP_ID, TABLE_NAME, TABLE_COMMENT, ... FROM ( SELECT DISTINCT t.TABLE_NAME, tc.COMMENTS AS TABLE_COMMENT FROM DBA_TABLES t LEFT JOIN DBA_TAB_COMMENTS tc ON ... LEFT JOIN DBA_TAB_COLUMNS c ON ... WHERE t.OWNER CIRCLE ) distinct_tables ) Combined ORDER BY ...;5. CTE在不同数据库中的支持情况数据库支持情况备注Oracle✅ 支持Oracle 9i及以上SQL Server✅ 支持SQL Server 2005及以上PostgreSQL✅ 支持MySQL✅ 支持MySQL 8.0及以上达梦数据库✅ 支持达梦支持CTE语法SQLite✅ 支持SQLite 3.8.3及以上6. CTE的实用示例示例1简单的CTE-- 查询部门平均工资高于公司平均工资的部门 WITH DeptAvg AS ( SELECT dept_id, AVG(salary) as avg_salary FROM employees GROUP BY dept_id ), CompanyAvg AS ( SELECT AVG(salary) as company_avg FROM employees ) SELECT d.dept_id, d.avg_salary, c.company_avg FROM DeptAvg d, CompanyAvg c WHERE d.avg_salary c.company_avg;示例2递归CTE查询树形结构-- 查询组织架构树 WITH RECURSIVE OrgTree AS ( -- 初始查询根节点 SELECT id, name, parent_id, 1 as level FROM organization WHERE parent_id IS NULL UNION ALL -- 递归查询子节点 SELECT o.id, o.name, o.parent_id, ot.level 1 FROM organization o INNER JOIN OrgTree ot ON o.parent_id ot.id ) SELECT * FROM OrgTree ORDER BY level, id;7. 在你的场景中的好处使用CTE让你的查询更清晰将数据准备逻辑TableData与展示逻辑分离更易维护如果需要修改数据获取逻辑只需修改CTE部分性能可能更好数据库优化器可以更好地优化CTE8. 注意事项CTE只在当前查询中有效CTE定义的作用域仅限于当前查询可以引用前面的CTE后面的CTE可以引用前面定义的CTE不能嵌套不能在CTE内部再定义CTE分号位置CTE定义结束后主查询前不需要分号你的查询使用了CTE来构建一个表格化的表结构输出这是一种很好的实践特别是当需要生成包含表头、标题行、数据行和分隔行的完整报表时。