ORACLE多表关联

  • ORACLE外链接
  • 案例:
  • 关键条件ON与WHERE
  • WHERE影响了谁
  • 总结ON与WHERE


ORACLE外链接

ORACLE常用的外连接

LEFT JOIN //左外连接
RIGHT JOIN //右外连接

关于外连接使用一定要谨慎小心 ON 与WHERE
通过一个实际的情况做一下总结行描述

案例:

我是抽出来的一部分数据做个DEMO样例

1.主业务表线路站点表

我导入了2条线路52条站点数据

大表匹配小表怎么更快速mysql oracle大表和小表关联_数据库开发

2.业务数据表线路站点每天的客流数据共计103条

大表匹配小表怎么更快速mysql oracle大表和小表关联_外链_02

关键条件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相同的条件的数据集合

大表匹配小表怎么更快速mysql oracle大表和小表关联_数据库开发_03

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

大表匹配小表怎么更快速mysql oracle大表和小表关联_数据_04

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

大表匹配小表怎么更快速mysql oracle大表和小表关联_外链_05

为什么呢?如果没有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

大表匹配小表怎么更快速mysql oracle大表和小表关联_大表匹配小表怎么更快速mysql_06

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

大表匹配小表怎么更快速mysql oracle大表和小表关联_外链_07

总结ON与WHERE

1、ON后面有N个条件就像你创建视图一样先做一次筛选过滤
2、WHERE 条件是在你关联好视图中进行过滤数据