ORACLE多表关联
- ORACLE外链接
- 案例:
- 关键条件ON与WHERE
- WHERE影响了谁
- 总结ON与WHERE
ORACLE外链接
ORACLE常用的外连接
LEFT JOIN //左外连接
RIGHT JOIN //右外连接
关于外连接使用一定要谨慎小心 ON 与WHERE
通过一个实际的情况做一下总结行描述
案例:
我是抽出来的一部分数据做个DEMO样例
1.主业务表线路站点表
我导入了2条线路52条站点数据
2.业务数据表线路站点每天的客流数据共计103条
关键条件ON与WHERE
说一下ON的条件 作用实际关联两个表以后,
一定要接一个ON条件,ON后面的可以使用多个条件但是至少包含一个条件
并且ON后面的条件只能影响Y表的数据 不会影响主表的X的数据
这样X 表与 Y表就会出现一个用ON关联的条件形成的一个视图存储两个表关联的所有数据
SELECT X.*,Y.* FROM TMP_XL_ZD X
LEFT JOIN TMP_KL_ZD Y ON X.ZDID = Y.ZDID
ORDER BY TO_NUMBER(X.ZDXH) ,X.CKXLID
1、什么条件也不加结果展示103条业务数据是将主表与从表所有ZDID相同的条件的数据集合
2、现在我增加了一个条件日期只取系统2天前的数据
SELECT X.*,Y.* FROM TMP_XL_ZD X
LEFT JOIN TMP_KL_ZD Y ON X.ZDID = Y.ZDID AND Y.RKRQ = TRUNC(SYSDATE-2)
ORDER BY TO_NUMBER(X.ZDXH) ,X.CKXLID
3、现在我又加了一个XLID的条件:发现了重要的变化
表数据还是52条,但是只影响了Y表结果不在XLID的条件都不显示
SELECT X.*,Y.* FROM TMP_XL_ZD X
LEFT JOIN TMP_KL_ZD Y ON X.ZDID = Y.ZDID AND Y.RKRQ = TRUNC(SYSDATE-2) AND Y.XLID = 136712
ORDER BY TO_NUMBER(X.ZDXH) ,X.CKXLID
为什么呢?如果没有ON后面的第一个条件你会看见视图数据中实际还有多天的数据,但是如果加了ON的条件就多了一个RQ的限制Y表的数据只显示一条线路的,但是不会影响主表X的过滤。
并且 这个ON后面的在加条件 无论是X表的条件还是Y表的条件都只是影响
Y表的数据
WHERE影响了谁
实际WHERE就开始使用上面ON条件生成的新的视图结果进行过滤
1、这里我在where条件使用了X.CKXLID结果就是从之前的52条记录中筛选的结果
此时查询结果如下:
达到我预期想要的内容,站点数据链完整,客流数据不存在用空值补全
SELECT X.*,Y.* FROM TMP_XL_ZD X
LEFT JOIN TMP_KL_ZD Y ON X.ZDID = Y.ZDID AND Y.RKRQ = TRUNC(SYSDATE-2) AND Y.XLID = 136712
WHERE 1=1 AND X.CKXLID = 136712
ORDER BY TO_NUMBER(X.ZDXH) ,X.CKXLID
2、如果我们用错了条件
使用Y.XLID过滤结果就是下面的图
丢失了一个站点数据站点序号1的数据没有了
SELECT X.*,Y.* FROM TMP_XL_ZD X
LEFT JOIN TMP_KL_ZD Y ON X.ZDID = Y.ZDID AND Y.RKRQ = TRUNC(SYSDATE-2) AND Y.XLID = 136712
WHERE 1=1 AND Y.XLID = 136712
ORDER BY TO_NUMBER(X.ZDXH) ,X.CKXLID
总结ON与WHERE
1、ON后面有N个条件就像你创建视图一样先做一次筛选过滤
2、WHERE 条件是在你关联好视图中进行过滤数据