- 2022-04-28
本文介绍间接数据流中的where-group-by子句。
1、列在where子句中
WHERE子句中源表中的某些列不影响目标列,但对所选行集至关重要,因此应保存这些列以进行影响分析,并向目标表间接提供数据流。
以下述SQL为例:
SELECT a.empName "eName" FROM scott.emp a Where sal > 1000
select列表的总行数受where子句中sal列的值影响,我们为这种关系建立了一个间接数据流:
scott.emp.sal -> indirect -> RS-1.RelationRows
数据流图示:
2. COUNT()
COUNT()函数是一个聚合函数,用于计算关系的总行数。
2.1 where子句中不包含 group by
示例SQL: SELECT COUNT() num_emp FROM scott.emp where city=1
在上面的SQL中,将创建两个间接数据流,因为COUNT()的值受where子句中的city列和scott.emp表的总行数的影响。
scott.emp.city -> indirect -> COUNT()
scott.emp.RelationRow -> indirect -> COUNT()
数据流图示:
2.2 where 子句中包含 group by
SELECT deptno, count() total_num
FROM scott.emp
where city=1
group by deptno;
如您所见,除了在前面的SQL中创建的两个间接数据流之外,还使用GROUPBY子句中的deptno创建了第三个间接数据流。
scott.emp.city -> indirect -> COUNT() scott.emp.Relations -> indirect -> COUNT() scott.emp.deptno -> indirect -> COUNT()
3. 其他聚合函数
创建间接数据流时,其他聚合函数,如SUM()的工作原理与COUNT()函数略有不同。
3.1 where子句中包含 group by
SELECT deptno, SUM(SAL) sal_sum
FROM scott.emp
where city=1
group by deptno
聚合函数(如SUM()根据group by子句中使用的列确定的记录集计算值,因此group by子句中的deptno列用于创建一个间接数据流到SUM()函数。
从deptno到SUM()创建了一个间接数据流。
scott.emp.deptno -> indirect -> SUM()
如果出现group by子句,RelationRows伪列将不用于创建间接数据流。
3.2 where 子句中不包含 group by
SELECT SUM(SAL) sal_sum
FROM scott.emp
where city=1
上面的SQL表示表的整个记录集将用于计算SUM()函数的值。
因此,将创建两个间接数据流,如下所示:
scott.emp.city -> indirect -> SUM() scott.emp.RelationRows -> indirect -> SUM()
4、参考
马哈鱼数据血缘分析器: https://sqlflow.gudusoft.com
马哈鱼数据血缘分析器中文网站: https://www.sqlflow.cn